<!doctype html>
<html>
<head>
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>
<title>设计</title><link href='https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext' rel='stylesheet' type='text/css' /><style type='text/css'>html {overflow-x: initial !important;}:root { --node-fill: #ECECFF; --node-border: #CCCCFF; --cluster-fill: #ffffde; --cluster-border: #aaaa33; --note-fill: #fff5ad; --note-border: #aaaa33; --mermaid-color: var(--text-color); }
.label { font-family: var(--mermaid-font-family); color: rgb(51, 51, 51); }
.label text { fill: rgb(51, 51, 51); }
.node rect, .node circle, .node ellipse, .node polygon { fill: var(--node-fill); stroke: rgb(147, 112, 219); stroke-width: 1px; }
.node .label { text-align: center; }
.node.clickable { cursor: pointer; }
.arrowheadPath { fill: var(--text-color); }
.edgePath .path { stroke: var(--text-color); stroke-width: 1.5px; }
.edgeLabel { background-color: rgb(232, 232, 232); text-align: center; }
.cluster rect { fill: var(--cluster-fill); stroke: var(--cluster-border); stroke-width: 1px; }
.cluster text { fill: var(--text-color); }
div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: var(--mermaid-font-family); font-size: 12px; background: var(--cluster-fill); border: 1px solid var(--cluster-border); border-radius: 2px; pointer-events: none; z-index: 100; }
.actor { stroke: var(--node-border); fill: var(--node-fill); }
text.actor { fill: black; stroke: none; }
.actor-line { stroke: grey; }
.messageLine0 { stroke-width: 1.5; stroke: var(--text-color); }
.messageLine1 { stroke-width: 1.5; stroke: var(--text-color); }
#arrowhead { fill: var(--text-color); }
.sequenceNumber { fill: white; }
#sequencenumber { fill: var(--text-color); }
#crosshead path { fill: var(--text-color)  !important; stroke: var(--text-color)  !important; }
.messageText { fill: var(--text-color); stroke: none; }
.labelBox { stroke: var(--node-border); fill: var(--node-fill); }
.labelText { fill: black; stroke: none; }
.loopText { fill: black; stroke: none; }
.loopLine { stroke-width: 2; stroke: var(--node-border); }
.note { stroke: var(--cluster-border); fill: rgb(255, 245, 173); }
.noteText { fill: black; stroke: none; font-family: var(--mermaid-font-family); font-size: 14px; }
.activation0 { fill: rgb(244, 244, 244); stroke: rgb(102, 102, 102); }
.activation1 { fill: rgb(244, 244, 244); stroke: rgb(102, 102, 102); }
.activation2 { fill: rgb(244, 244, 244); stroke: rgb(102, 102, 102); }
.mermaid-main-font { font-family: var(--mermaid-font-family); }
.section { stroke: none; opacity: 0.2; }
.section0 { fill: rgba(102, 102, 255, 0.49); }
.section2 { fill: rgb(255, 244, 0); }
.section1, .section3 { fill: white; opacity: 0.2; }
.sectionTitle0 { fill: var(--text-color); }
.sectionTitle1 { fill: var(--text-color); }
.sectionTitle2 { fill: var(--text-color); }
.sectionTitle3 { fill: var(--text-color); }
.sectionTitle { text-anchor: start; font-size: 11px; font-family: var(--mermaid-font-family); }
.grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispedges; }
.grid .tick text { font-family: var(--mermaid-font-family); }
.grid path { stroke-width: 0; }
.today { fill: none; stroke: red; stroke-width: 2px; }
.task { stroke-width: 2; }
.taskText { text-anchor: middle; font-family: var(--mermaid-font-family); }
.taskText:not([font-size]) { font-size: 11px; }
.taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; font-family: var(--mermaid-font-family); }
.taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; }
.task.clickable { cursor: pointer; }
.taskText.clickable { cursor: pointer; font-weight: bold; fill: rgb(0, 49, 99) !important; }
.taskTextOutsideLeft.clickable { cursor: pointer; font-weight: bold; fill: rgb(0, 49, 99) !important; }
.taskTextOutsideRight.clickable { cursor: pointer; font-weight: bold; fill: rgb(0, 49, 99) !important; }
.taskText0, .taskText1, .taskText2, .taskText3 { fill: white; }
.task0, .task1, .task2, .task3 { fill: rgb(138, 144, 221); stroke: rgb(83, 79, 188); }
.taskTextOutside0, .taskTextOutside2 { fill: black; }
.taskTextOutside1, .taskTextOutside3 { fill: black; }
.active0, .active1, .active2, .active3 { fill: rgb(191, 199, 255); stroke: rgb(83, 79, 188); }
.activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; }
.done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2; }
.doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; }
.crit0, .crit1, .crit2, .crit3 { stroke: rgb(255, 136, 136); fill: red; stroke-width: 2; }
.activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: rgb(255, 136, 136); fill: rgb(191, 199, 255); stroke-width: 2; }
.doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: rgb(255, 136, 136); fill: lightgrey; stroke-width: 2; cursor: pointer; shape-rendering: crispedges; }
.milestone { transform: rotate(45deg) scale(0.8, 0.8); }
.milestoneText { font-style: italic; }
.doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; }
.activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; }
.titleText { text-anchor: middle; font-size: 18px; fill: black; font-family: var(--mermaid-font-family); }
g.classGroup text { fill: rgb(147, 112, 219); stroke: none; font-family: var(--mermaid-font-family); font-size: 10px; }
g.classGroup text .title { font-weight: bolder; }
g.classGroup rect { fill: var(--node-fill); stroke: rgb(147, 112, 219); }
g.classGroup line { stroke: rgb(147, 112, 219); stroke-width: 1; }
.classLabel .box { stroke: none; stroke-width: 0; fill: var(--node-fill); opacity: 0.5; }
.classLabel .label { fill: rgb(147, 112, 219); font-size: 10px; }
.relation { stroke: rgb(147, 112, 219); stroke-width: 1; fill: none; }
#compositionStart { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1; }
#compositionEnd { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1; }
#aggregationStart { fill: var(--node-fill); stroke: rgb(147, 112, 219); stroke-width: 1; }
#aggregationEnd { fill: var(--node-fill); stroke: rgb(147, 112, 219); stroke-width: 1; }
#dependencyStart { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1; }
#dependencyEnd { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1; }
#extensionStart { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1; }
#extensionEnd { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1; }
.commit-id, .commit-msg, .branch-label { fill: lightgrey; color: lightgrey; font-family: var(--mermaid-font-family); }
.pieTitleText { text-anchor: middle; font-size: 25px; fill: var(--text-color); font-family: var(--mermaid-font-family); }
.slice { font-family: var(--mermaid-font-family); }
g.stateGroup text { fill: rgb(147, 112, 219); stroke: none; font-size: 10px; font-family: var(--mermaid-font-family); }
g.stateGroup text { fill: rgb(147, 112, 219); stroke: none; font-size: 10px; }
g.stateGroup .state-title { font-weight: bolder; fill: black; }
g.stateGroup rect { fill: var(--node-fill); stroke: rgb(147, 112, 219); }
g.stateGroup line { stroke: rgb(147, 112, 219); stroke-width: 1; }
.transition { stroke: rgb(147, 112, 219); stroke-width: 1; fill: none; }
.stateGroup .composit { fill: white; border-bottom: 1px; }
.state-note { stroke: var(--cluster-border); fill: rgb(255, 245, 173); }
.state-note text { fill: black; stroke: none; font-size: 10px; }
.stateLabel .box { stroke: none; stroke-width: 0; fill: var(--node-fill); opacity: 0.5; }
.stateLabel text { fill: black; font-size: 10px; font-weight: bold; font-family: var(--mermaid-font-family); }
.node text { font-size: 14px; }
div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: var(--mermaid-font-family); font-size: 12px; background: var(--cluster-fill); border: 1px solid var(--cluster-border); border-radius: 2px; pointer-events: none; z-index: 100; }
#write .md-diagram-panel .md-diagram-panel-preview div { width: initial; }


:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:"Lucida Console",Consolas,"Courier",monospace; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
body { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0px; right: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; tab-size: 4; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 40px; }
#write.first-line-indent p { text-indent: 2em; }
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
#write.first-line-indent li { margin-left: 2em; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
@media screen and (max-width: 500px) {
  body.typora-export { padding-left: 0px; padding-right: 0px; }
  #write { padding-left: 20px; padding-right: 20px; }
  .CodeMirror-sizer { margin-left: 0px !important; }
  .CodeMirror-gutters { display: none !important; }
}
#write li > figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; }
button, input, select, textarea { color: inherit; font: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px !important; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror-linenumber { user-select: none; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-diagram-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
  body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }
  #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }
  .typora-export * { -webkit-print-color-adjust: exact; }
  html.blink-to-pdf { font-size: 13px; }
  .typora-export #write { padding-left: 32px; padding-right: 32px; padding-bottom: 0px; break-after: avoid; }
  .typora-export #write::after { height: 0px; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
  .md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
  .md-toc-h4 .md-toc-inner { margin-left: 5em; }
  .md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
  .md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.md-inline-math .MathJax_SVG .noError { display: none !important; }
.html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; }
.md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: hidden; display: block !important; }
.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }
.MathJax_SVG .MJX-monospace { font-family: var(--monospace); }
.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }
.MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; zoom: 90%; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; }
.MathJax_SVG * { transition: none 0s ease 0s; }
.MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }
svg[id^="mermaidChart"] { line-height: 1em; }
mark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
mark .md-meta { color: rgb(0, 0, 0); opacity: 0.3 !important; }


.CodeMirror { height: auto; }
.CodeMirror.cm-s-inner { background: inherit; }
.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }
.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }
.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; }
.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }
.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }
.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }
.cm-s-inner .cm-number { color: rgb(17, 102, 68); }
.cm-s-inner .cm-def { color: rgb(0, 0, 255); }
.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }
.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }
.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }
.cm-s-inner .cm-string { color: rgb(170, 17, 17); }
.cm-s-inner .cm-property { color: rgb(0, 0, 0); }
.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }
.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }
.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }
.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }
.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }
.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }
.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }
.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }
.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }
.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }
.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }
.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }
.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }
.cm-negative { color: rgb(221, 68, 68); }
.cm-positive { color: rgb(34, 153, 34); }
.cm-header, .cm-strong { font-weight: 700; }
.cm-del { text-decoration: line-through; }
.cm-em { font-style: italic; }
.cm-link { text-decoration: underline; }
.cm-error { color: red; }
.cm-invalidchar { color: red; }
.cm-constant { color: rgb(38, 139, 210); }
.cm-defined { color: rgb(181, 137, 0); }
div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }
.cm-s-inner .CodeMirror-activeline-background { background: inherit; }
.CodeMirror { position: relative; overflow: hidden; }
.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; }
.CodeMirror-sizer { position: relative; }
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; }
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: hidden; }
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 30px; z-index: 3; }
.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; }
.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }
.CodeMirror-lines { cursor: text; }
.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; }
.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }
.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; }
.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; }
.CodeMirror-linebackground { position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; z-index: 0; }
.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }
.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }
.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; }
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }
.cm-searching { background: rgba(255, 255, 0, 0.4); }
@media print {
  .CodeMirror div.CodeMirror-cursor { visibility: hidden; }
}


:root {
    --side-bar-bg-color: #fafafa;
    --control-text-color: #777;
}

@include-when-export url(https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext);

html {
    font-size: 16px;
}

body {
    font-family: "Open Sans","Clear Sans","Helvetica Neue",Helvetica,Arial,sans-serif;
    color: rgb(51, 51, 51);
    line-height: 1.6;
}

#write {
    max-width: 860px;
  	margin: 0 auto;
  	padding: 30px;
    padding-bottom: 100px;
}

@media only screen and (min-width: 1400px) {
	#write {
		max-width: 1024px;
	}
}

@media only screen and (min-width: 1800px) {
	#write {
		max-width: 1200px;
	}
}

#write > ul:first-child,
#write > ol:first-child{
    margin-top: 30px;
}

a {
    color: #4183C4;
}
h1,
h2,
h3,
h4,
h5,
h6 {
    position: relative;
    margin-top: 1rem;
    margin-bottom: 1rem;
    font-weight: bold;
    line-height: 1.4;
    cursor: text;
}
h1:hover a.anchor,
h2:hover a.anchor,
h3:hover a.anchor,
h4:hover a.anchor,
h5:hover a.anchor,
h6:hover a.anchor {
    text-decoration: none;
}
h1 tt,
h1 code {
    font-size: inherit;
}
h2 tt,
h2 code {
    font-size: inherit;
}
h3 tt,
h3 code {
    font-size: inherit;
}
h4 tt,
h4 code {
    font-size: inherit;
}
h5 tt,
h5 code {
    font-size: inherit;
}
h6 tt,
h6 code {
    font-size: inherit;
}
h1 {
    padding-bottom: .3em;
    font-size: 2.25em;
    line-height: 1.2;
    border-bottom: 1px solid #eee;
}
h2 {
   padding-bottom: .3em;
    font-size: 1.75em;
    line-height: 1.225;
    border-bottom: 1px solid #eee;
}
h3 {
    font-size: 1.5em;
    line-height: 1.43;
}
h4 {
    font-size: 1.25em;
}
h5 {
    font-size: 1em;
}
h6 {
   font-size: 1em;
    color: #777;
}
p,
blockquote,
ul,
ol,
dl,
table{
    margin: 0.8em 0;
}
li>ol,
li>ul {
    margin: 0 0;
}
hr {
    height: 2px;
    padding: 0;
    margin: 16px 0;
    background-color: #e7e7e7;
    border: 0 none;
    overflow: hidden;
    box-sizing: content-box;
}

li p.first {
    display: inline-block;
}
ul,
ol {
    padding-left: 30px;
}
ul:first-child,
ol:first-child {
    margin-top: 0;
}
ul:last-child,
ol:last-child {
    margin-bottom: 0;
}
blockquote {
    border-left: 4px solid #dfe2e5;
    padding: 0 15px;
    color: #777777;
}
blockquote blockquote {
    padding-right: 0;
}
table {
    padding: 0;
    word-break: initial;
}
table tr {
    border-top: 1px solid #dfe2e5;
    margin: 0;
    padding: 0;
}
table tr:nth-child(2n),
thead {
    background-color: #f8f8f8;
}
table tr th {
    font-weight: bold;
    border: 1px solid #dfe2e5;
    border-bottom: 0;
    margin: 0;
    padding: 6px 13px;
}
table tr td {
    border: 1px solid #dfe2e5;
    margin: 0;
    padding: 6px 13px;
}
table tr th:first-child,
table tr td:first-child {
    margin-top: 0;
}
table tr th:last-child,
table tr td:last-child {
    margin-bottom: 0;
}

.CodeMirror-lines {
    padding-left: 4px;
}

.code-tooltip {
    box-shadow: 0 1px 1px 0 rgba(0,28,36,.3);
    border-top: 1px solid #eef2f2;
}

.md-fences,
code,
tt {
    border: 1px solid #e7eaed;
    background-color: #f8f8f8;
    border-radius: 3px;
    padding: 0;
    padding: 2px 4px 0px 4px;
    font-size: 0.9em;
}

code {
    background-color: #f3f4f4;
    padding: 0 2px 0 2px;
}

.md-fences {
    margin-bottom: 15px;
    margin-top: 15px;
    padding-top: 8px;
    padding-bottom: 6px;
}


.md-task-list-item > input {
  margin-left: -1.3em;
}

@media print {
    html {
        font-size: 13px;
    }
    table,
    pre {
        page-break-inside: avoid;
    }
    pre {
        word-wrap: break-word;
    }
}

.md-fences {
	background-color: #f8f8f8;
}
#write pre.md-meta-block {
	padding: 1rem;
    font-size: 85%;
    line-height: 1.45;
    background-color: #f7f7f7;
    border: 0;
    border-radius: 3px;
    color: #777777;
    margin-top: 0 !important;
}

.mathjax-block>.code-tooltip {
	bottom: .375rem;
}

.md-mathjax-midline {
    background: #fafafa;
}

#write>h3.md-focus:before{
	left: -1.5625rem;
	top: .375rem;
}
#write>h4.md-focus:before{
	left: -1.5625rem;
	top: .285714286rem;
}
#write>h5.md-focus:before{
	left: -1.5625rem;
	top: .285714286rem;
}
#write>h6.md-focus:before{
	left: -1.5625rem;
	top: .285714286rem;
}
.md-image>.md-meta {
    /*border: 1px solid #ddd;*/
    border-radius: 3px;
    padding: 2px 0px 0px 4px;
    font-size: 0.9em;
    color: inherit;
}

.md-tag {
    color: #a7a7a7;
    opacity: 1;
}

.md-toc { 
    margin-top:20px;
    padding-bottom:20px;
}

.sidebar-tabs {
    border-bottom: none;
}

#typora-quick-open {
    border: 1px solid #ddd;
    background-color: #f8f8f8;
}

#typora-quick-open-item {
    background-color: #FAFAFA;
    border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee;
    border-style: solid;
    border-width: 1px;
}

/** focus mode */
.on-focus-mode blockquote {
    border-left-color: rgba(85, 85, 85, 0.12);
}

header, .context-menu, .megamenu-content, footer{
    font-family: "Segoe UI", "Arial", sans-serif;
}

.file-node-content:hover .file-node-icon,
.file-node-content:hover .file-node-open-state{
    visibility: visible;
}

.mac-seamless-mode #typora-sidebar {
    background-color: #fafafa;
    background-color: var(--side-bar-bg-color);
}

.md-lang {
    color: #b4654d;
}

.html-for-mac .context-menu {
    --item-hover-bg-color: #E6F0FE;
}

#md-notification .btn {
    border: 0;
}

.dropdown-menu .divider {
    border-color: #e5e5e5;
}

.ty-preferences .window-content {
    background-color: #fafafa;
}

.ty-preferences .nav-group-item.active {
    color: white;
    background: #999;
}

 .typora-export li, .typora-export p, .typora-export,  .footnote-line {white-space: normal;} 
</style>
</head>
<body class='typora-export os-windows' >
<div  id='write'  class = 'is-node'><h1><a name="大作业设计" class="md-header-anchor"></a><span>大作业设计</span></h1><p><span>设计文档</span></p><ul><li><span>前言</span></li><li><span>业务描述</span></li><li><span>数据库设计（ER图）</span></li><li><span>应用系统模块设计、以及功能点描述</span></li><li><span>系统实现描述</span></li><li><span>总结</span></li><li><span>参考文献和资料</span></li></ul><div class='md-toc' mdtype='toc'><p class="md-toc-content" role="list"><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n0"><a class="md-toc-inner" href="#大作业设计">大作业设计</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n20"><a class="md-toc-inner" href="#前言">前言</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n24"><a class="md-toc-inner" href="#业务描述">业务描述</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n41"><a class="md-toc-inner" href="#数据库设计er图）">数据库设计（ER图）</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n42"><a class="md-toc-inner" href="#er图">ER图</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n45"><a class="md-toc-inner" href="#解释">解释</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n67"><a class="md-toc-inner" href="#转换为关系模型">转换为关系模型</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n351"><a class="md-toc-inner" href="#应用系统模块设计功能点描述">应用系统模块设计、功能点描述</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n357"><a class="md-toc-inner" href="#读者功能-登录">读者功能-登录</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n367"><a class="md-toc-inner" href="#读者功能-退出登录">读者功能-退出登录</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n370"><a class="md-toc-inner" href="#读者功能-修改密码">读者功能-修改密码</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n380"><a class="md-toc-inner" href="#读者功能-校外注册">读者功能-校外注册</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n385"><a class="md-toc-inner" href="#读者功能-图书信息查询">读者功能-图书信息查询</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n389"><a class="md-toc-inner" href="#读者功能-图书借阅">读者功能-图书借阅</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n392"><a class="md-toc-inner" href="#读者功能-图书归还延期">读者功能-图书归还&amp;延期</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n397"><a class="md-toc-inner" href="#管理功能-管理员登录与登出">管理功能-管理员登录与登出</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n408"><a class="md-toc-inner" href="#管理功能-用户管理">管理功能-用户管理</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n418"><a class="md-toc-inner" href="#管理功能-图书管理">管理功能-图书管理</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n423"><a class="md-toc-inner" href="#管理功能-超级管理员">管理功能-超级管理员</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n427"><a class="md-toc-inner" href="#管理功能-数据展示">管理功能-数据展示</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n430"><a class="md-toc-inner" href="#系统描述实现">系统描述实现</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n431"><a class="md-toc-inner" href="#python环境">python环境</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n443"><a class="md-toc-inner" href="#数据库配置">数据库配置</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n451"><a class="md-toc-inner" href="#网页模板设计">网页模板设计</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n477"><a class="md-toc-inner" href="#初始数据">初始数据</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n511"><a class="md-toc-inner" href="#用户端功能">用户端功能</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n512"><a class="md-toc-inner" href="#登录">登录</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n521"><a class="md-toc-inner" href="#登出">登出</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n524"><a class="md-toc-inner" href="#注册">注册</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n533"><a class="md-toc-inner" href="#图书信息查询">图书信息查询</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n539"><a class="md-toc-inner" href="#图书借阅">图书借阅</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n545"><a class="md-toc-inner" href="#图书归还与续借">图书归还与续借</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n549"><a class="md-toc-inner" href="#管理端基础">管理端基础</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n552"><a class="md-toc-inner" href="#用户管理">用户管理</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n555"><a class="md-toc-inner" href="#被禁用的账号">被禁用的账号</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n558"><a class="md-toc-inner" href="#逾期不还书封号">逾期不还书封号</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n562"><a class="md-toc-inner" href="#固定参数统计图">固定参数统计图</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n564"><a class="md-toc-inner" href="#图书管理">图书管理</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n565"><a class="md-toc-inner" href="#已知图书管理">已知图书管理</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n571"><a class="md-toc-inner" href="#图书入库">图书入库</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n577"><a class="md-toc-inner" href="#超级管理">超级管理</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n580"><a class="md-toc-inner" href="#数据展示">数据展示</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n585"><a class="md-toc-inner" href="#总结">总结</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n632"><a class="md-toc-inner" href="#参考文献和资料">参考文献和资料</a></span></p></div><h2><a name="前言" class="md-header-anchor"></a><span>前言</span></h2><p><span>本作业旨在完成一个图书管理系统，从而实践学习到的数据库知识。</span></p><p><span>图书管理系统的模式参考学校的图书馆借阅流程</span></p><p>&nbsp;</p><h2><a name="业务描述" class="md-header-anchor"></a><span>业务描述</span></h2><p><span>业务目标是实现一个学校的图书馆管理系统，作为学校的图书馆管理系统，包含两个部分：</span></p><ul><li><p><span>学生/老师：作为借阅者，可以登录、操作（借阅还书延期等）、退出登录</span></p></li><li><p><span>管理者：</span></p><ul><li><span>用户管理：通过管理系统，管理借阅者的情况，处理用户的借阅问题</span></li><li><span>图书馆员工：通过管理系统，添加、修改、下架图书</span></li><li><span>超级管理：查看其它管理者操作记录</span></li></ul></li></ul><div class="md-diagram-panel"><svg id="mermaidChart0" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 888.046875px;" viewBox="0 0 888.046875 146"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M329.046875,47.3652151675075L48.0078125,85L48.0078125,110" marker-end="url(#arrowhead13)" style="fill:none"></path><defs><marker id="arrowhead13" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M329.046875,50.75977312094555L154.0234375,85L154.0234375,110" marker-end="url(#arrowhead14)" style="fill:none"></path><defs><marker id="arrowhead14" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M329.046875,59.95841995841996L260.0390625,85L260.0390625,110" marker-end="url(#arrowhead15)" style="fill:none"></path><defs><marker id="arrowhead15" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M384.046875,60L384.046875,85L384.046875,110" marker-end="url(#arrowhead16)" style="fill:none"></path><defs><marker id="arrowhead16" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M439.046875,57.429577464788736L526.046875,85L526.046875,110" marker-end="url(#arrowhead17)" style="fill:none"></path><defs><marker id="arrowhead17" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M439.046875,48.71478873239437L668.046875,85L668.046875,110" marker-end="url(#arrowhead18)" style="fill:none"></path><defs><marker id="arrowhead18" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M439.046875,45.57432432432432L828.046875,85L828.046875,110" marker-end="url(#arrowhead19)" style="fill:none"></path><defs><marker id="arrowhead19" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="A" transform="translate(384.046875,40)" style="opacity: 1;"><rect rx="0" ry="0" x="-55" y="-20" width="110" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-45,-10)"><foreignObject width="90" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">借阅者操作</div></foreignObject></g></g></g><g class="node" id="A1" transform="translate(48.0078125,130)" style="opacity: 1;"><rect rx="0" ry="0" x="-28.0078125" y="-20" width="56.015625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-18.0078125,-10)"><foreignObject width="36.015625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">登录</div></foreignObject></g></g></g><g class="node" id="A2" transform="translate(154.0234375,130)" style="opacity: 1;"><rect rx="0" ry="0" x="-28.0078125" y="-20" width="56.015625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-18.0078125,-10)"><foreignObject width="36.015625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">登出</div></foreignObject></g></g></g><g class="node" id="A3" transform="translate(260.0390625,130)" style="opacity: 1;"><rect rx="0" ry="0" x="-28.0078125" y="-20" width="56.015625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-18.0078125,-10)"><foreignObject width="36.015625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">注册</div></foreignObject></g></g></g><g class="node" id="A4" transform="translate(384.046875,130)" style="opacity: 1;"><rect rx="0" ry="0" x="-46" y="-20" width="92" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36,-10)"><foreignObject width="72.01171875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">修改密码</div></foreignObject></g></g></g><g class="node" id="A5" transform="translate(526.046875,130)" style="opacity: 1;"><rect rx="0" ry="0" x="-46" y="-20" width="92" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36,-10)"><foreignObject width="72.01171875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">查找图书</div></foreignObject></g></g></g><g class="node" id="A6" transform="translate(668.046875,130)" style="opacity: 1;"><rect rx="0" ry="0" x="-46" y="-20" width="92" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36,-10)"><foreignObject width="72.01171875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">借阅图书</div></foreignObject></g></g></g><g class="node" id="A7" transform="translate(828.046875,130)" style="opacity: 1;"><rect rx="0" ry="0" x="-64" y="-20" width="128" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-54,-10)"><foreignObject width="108.0078125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">归还或者延期</div></foreignObject></g></g></g></g></g></g></svg></div><div class="md-diagram-panel"><svg id="mermaidChart1" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 847.69921875px;" viewBox="0 0 847.69921875 236"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M552.015625,44.621623743033815L150.12109375,85L150.12109375,110" marker-end="url(#arrowhead38)" style="fill:none"></path><defs><marker id="arrowhead38" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M588.2847222222222,60L576.12109375,85L576.12109375,110" marker-end="url(#arrowhead39)" style="fill:none"></path><defs><marker id="arrowhead39" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M104.73741319444444,150L48.0078125,175L48.0078125,200" marker-end="url(#arrowhead40)" style="fill:none"></path><defs><marker id="arrowhead40" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M159.85199652777777,150L172.015625,175L172.015625,200" marker-end="url(#arrowhead41)" style="fill:none"></path><defs><marker id="arrowhead41" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M196.12109375,142.6300736468289L314.015625,175L314.015625,200" marker-end="url(#arrowhead42)" style="fill:none"></path><defs><marker id="arrowhead42" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M530.12109375,147.23485218070056L456.015625,175L456.015625,200" marker-end="url(#arrowhead43)" style="fill:none"></path><defs><marker id="arrowhead43" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M585.8519965277778,150L598.015625,175L598.015625,200" marker-end="url(#arrowhead44)" style="fill:none"></path><defs><marker id="arrowhead44" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M622.12109375,142.6300736468289L740.015625,175L740.015625,200" marker-end="url(#arrowhead45)" style="fill:none"></path><defs><marker id="arrowhead45" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M644.015625,52.6300736468289L761.91015625,85L761.91015625,110" marker-end="url(#arrowhead46)" style="fill:none"></path><defs><marker id="arrowhead46" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="O" transform="translate(598.015625,40)" style="opacity: 1;"><rect rx="0" ry="0" x="-46" y="-20" width="92" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36,-10)"><foreignObject width="72.01171875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">管理操作</div></foreignObject></g></g></g><g class="node" id="A" transform="translate(150.12109375,130)" style="opacity: 1;"><rect rx="0" ry="0" x="-46" y="-20" width="92" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36,-10)"><foreignObject width="72.01171875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户管理</div></foreignObject></g></g></g><g class="node" id="A1" transform="translate(48.0078125,220)" style="opacity: 1;"><rect rx="0" ry="0" x="-28.0078125" y="-20" width="56.015625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-18.0078125,-10)"><foreignObject width="36.015625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">解禁</div></foreignObject></g></g></g><g class="node" id="A2" transform="translate(172.015625,220)" style="opacity: 1;"><rect rx="0" ry="0" x="-46" y="-20" width="92" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36,-10)"><foreignObject width="72.01171875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">逾期封号</div></foreignObject></g></g></g><g class="node" id="A3" transform="translate(314.015625,220)" style="opacity: 1;"><rect rx="0" ry="0" x="-46" y="-20" width="92" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36,-10)"><foreignObject width="72.01171875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">数据统计</div></foreignObject></g></g></g><g class="node" id="B" transform="translate(576.12109375,130)" style="opacity: 1;"><rect rx="0" ry="0" x="-46" y="-20" width="92" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36,-10)"><foreignObject width="72.01171875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">图书管理</div></foreignObject></g></g></g><g class="node" id="B1" transform="translate(456.015625,220)" style="opacity: 1;"><rect rx="0" ry="0" x="-46" y="-20" width="92" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36,-10)"><foreignObject width="72.01171875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">添加图书</div></foreignObject></g></g></g><g class="node" id="B2" transform="translate(598.015625,220)" style="opacity: 1;"><rect rx="0" ry="0" x="-46" y="-20" width="92" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36,-10)"><foreignObject width="72.01171875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">下架图书</div></foreignObject></g></g></g><g class="node" id="B3" transform="translate(740.015625,220)" style="opacity: 1;"><rect rx="0" ry="0" x="-46" y="-20" width="92" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-36,-10)"><foreignObject width="72.01171875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">更新图书</div></foreignObject></g></g></g><g class="node" id="C" transform="translate(761.91015625,130)" style="opacity: 1;"><rect rx="0" ry="0" x="-89.7890625" y="-20" width="179.578125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-79.7890625,-10)"><foreignObject width="159.58984375" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">超级管理--查看数据</div></foreignObject></g></g></g></g></g></g></svg></div><h2><a name="数据库设计er图）" class="md-header-anchor"></a><span>数据库设计（ER图）</span></h2><h3><a name="er图" class="md-header-anchor"></a><span>ER图</span></h3><p><img src="设计/ER.png" referrerpolicy="no-referrer"></p><p>&nbsp;</p><h3><a name="解释" class="md-header-anchor"></a><span>解释</span></h3><p><span>包含3个实体和3个联系：</span></p><ul><li><p><span>实体：</span></p><ul><li><span>借阅者：id（学生教师号）、姓名、密码、用户类型、在借书数目、备注、是否被禁用</span></li><li><span>图书：id（书号）、书名、简介、类型、作者、出版社、价格、数量、备注、是否下架</span></li><li><span>管理员：id（账号）、密码、权限类型、备注</span></li></ul></li><li><p><span>联系：</span></p><ul><li><span>借阅联系：借出时间、借阅期限、归还时间、状态、备注</span></li><li><span>用户信息修改：修改日期、修改类型、备注</span></li><li><span>图书管理：操作日期、操作类型、操作数值、原始数值、最终数值、备注</span></li></ul></li></ul><p>&nbsp;</p><h3><a name="转换为关系模型" class="md-header-anchor"></a><span>转换为关系模型</span></h3><figure><table><thead><tr><th><span>借阅者UserList</span></th><th><span>学生/教师号</span></th><th><span>姓名</span></th><th><span>密码</span></th><th><span>用户类型</span></th><th><span>在借书数量</span></th><th><span>备注</span></th><th><span>是否已经被禁用</span></th></tr></thead><tbody><tr><td><span>字段名</span></td><td><span>Uno</span></td><td><span>Uname</span></td><td><span>Upassword</span></td><td><span>Utype</span></td><td><span>Uget</span></td><td><span>more</span></td><td><span>Urestrict</span></td></tr><tr><td><span>字段类型</span></td><td><span>char</span></td><td><span>nvarchar</span></td><td><span>char</span></td><td><span>nvarchar</span></td><td><span>int</span></td><td><span>nvarchar</span></td><td><span>bit</span></td></tr><tr><td><span>限制</span></td><td><span>主键，11位</span></td><td><span>非空，最长10</span></td><td><span>32</span></td><td><span>最长10</span></td><td><span>非负，非空</span></td><td><span>2000</span></td><td><span>非空</span></td></tr><tr><td><span>备注</span></td><td><span>如S/T/U2018201661</span></td><td><span>真名字</span></td><td><span>初始化学号；MD5加密</span></td><td><span>有限的几种</span></td><td><span>业务检查即可</span></td><td><span>初始为空</span></td><td><span>0代表否</span></td></tr></tbody></table></figure><p>&nbsp;</p><figure><table><thead><tr><th><span>图书Book</span></th><th><span>书号</span></th><th><span>书名</span></th><th><span>简介</span></th><th><span>类型</span></th><th><span>作者</span></th><th><span>出版社</span></th><th><span>价格</span></th><th><span>剩余数量</span></th><th><span>备注</span></th><th><span>是否下架</span></th></tr></thead><tbody><tr><td><span>字段名</span></td><td><span>Bno</span></td><td><span>Bname</span></td><td><span>breif</span></td><td><span>Btype</span></td><td><span>author</span></td><td><span>Press</span></td><td><span>price</span></td><td><span>num</span></td><td><span>more</span></td><td><span>removed</span></td></tr><tr><td><span>字段类型</span></td><td><span>char</span></td><td><span>nvarcahr</span></td><td><span>nvarchar</span></td><td><span>nvarchar</span></td><td><span>nvarchar</span></td><td><span>nvarchar</span></td><td><span>numeric</span></td><td><span>整数</span></td><td><span>nvarchar</span></td><td><span>bit</span></td></tr><tr><td><span>限制</span></td><td><span>主键，13位</span></td><td><span>100以内，非空</span></td><td><span>1000以内</span></td><td><span>最长20</span></td><td><span>最长100</span></td><td><span>最长100</span></td><td><span>两位小数</span></td><td><span>非负</span></td><td><span>2000以内</span></td><td><span>非空</span></td></tr><tr><td><span>备注</span></td><td><span>ISBN号</span></td><td><span>含副标题</span></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td><span>人民币</span></td><td>&nbsp;</td><td><span>初始为空</span></td><td><span>0代表否</span></td></tr></tbody></table></figure><p>&nbsp;</p><figure><table><thead><tr><th><span>管理员AdminList</span></th><th><span>账号</span></th><th><span>密码</span></th><th><span>权限类型</span></th><th><span>备注</span></th></tr></thead><tbody><tr><td><span>字段名</span></td><td><span>Ano</span></td><td><span>Apassword</span></td><td><span>Atype</span></td><td><span>more</span></td></tr><tr><td><span>字段类型</span></td><td><span>char</span></td><td><span>char</span></td><td><span>nvarchar</span></td><td><span>nvarcahr</span></td></tr><tr><td><span>限制</span></td><td><span>主键，20以内</span></td><td><span>32</span></td><td><span>最长10</span></td><td><span>2000以内</span></td></tr><tr><td><span>备注</span></td><td>&nbsp;</td><td><span>MD5加密</span></td><td><span>不同权限不同效果</span></td><td>&nbsp;</td></tr></tbody></table></figure><p>&nbsp;</p><figure><table><thead><tr><th><span>借阅联系Borrow</span></th><th><span>借书人</span></th><th><span>被借书</span></th><th><span>借出时间</span></th><th><span>借阅期限</span></th><th><span>归还时间</span></th><th><span>状态</span></th><th><span>备注</span></th></tr></thead><tbody><tr><td><span>字段名</span></td><td><span>Uno</span></td><td><span>Bno</span></td><td><span>outDate</span></td><td><span>maxtime</span></td><td><span>returnDate</span></td><td><span>isReturn</span></td><td><span>more</span></td></tr><tr><td><span>字段类型</span></td><td><span>char</span></td><td><span>char</span></td><td><span>date</span></td><td><span>int</span></td><td><span>date</span></td><td><span>bit</span></td><td><span>nvarchar</span></td></tr><tr><td><span>限制</span></td><td><span>11</span></td><td><span>13</span></td><td>&nbsp;</td><td><span>非负</span></td><td><span>归还晚于借出</span></td><td><span>非空</span></td><td><span>2000</span></td></tr><tr><td><span>备注</span></td><td><span>外键</span></td><td><span>外键</span></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td><span>是否归还</span></td><td>&nbsp;</td></tr></tbody></table></figure><p><span>利用借书人+书+借出日期构成联合主键，因为同一个人可以借同一个书多次，但是一天内不能重复借（如果用时间戳更加严谨，但此处进行简化）</span></p><p>&nbsp;</p><p>&nbsp;</p><figure><table><thead><tr><th><span>用户信息修改UAlter</span></th><th><span>用户</span></th><th><span>管理者</span></th><th><span>修改时间</span></th><th><span>修改类型</span></th><th><span>备注</span></th></tr></thead><tbody><tr><td><span>字段名</span></td><td><span>Uno</span></td><td><span>Ano</span></td><td><span>actDate</span></td><td><span>AlterType</span></td><td><span>more</span></td></tr><tr><td><span>字段类型</span></td><td><span>char</span></td><td><span>char</span></td><td><span>date</span></td><td><span>nvarchar</span></td><td><span>nvarchar</span></td></tr><tr><td><span>限制</span></td><td><span>11</span></td><td><span>20</span></td><td>&nbsp;</td><td><span>非空，20</span></td><td><span>2000</span></td></tr><tr><td><span>备注</span></td><td><span>外键</span></td><td><span>外键</span></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr></tbody></table></figure><p><span>用户信息修改类型有：创建、改密码、禁用、解禁</span></p><p><span>采用用户+管理者+修改时间作为联合主键</span></p><p>&nbsp;</p><figure><table><thead><tr><th><span>图书管理BAlter</span></th><th><span>图书</span></th><th><span>管理者</span></th><th><span>操作时间</span></th><th><span>操作类型</span></th><th><span>操作数值</span></th><th><span>原始数值</span></th><th><span>最终数值</span></th><th><span>备注</span></th></tr></thead><tbody><tr><td><span>字段名</span></td><td><span>Bno</span></td><td><span>Ano</span></td><td><span>actDate</span></td><td><span>AlterType</span></td><td><span>act</span></td><td><span>old</span></td><td><span>new</span></td><td><span>more</span></td></tr><tr><td><span>字段类型</span></td><td><span>char</span></td><td><span>char</span></td><td><span>date</span></td><td><span>nvarchar</span></td><td><span>int</span></td><td><span>int</span></td><td><span>int</span></td><td><span>nvarchar</span></td></tr><tr><td><span>限制</span></td><td><span>13</span></td><td><span>20</span></td><td>&nbsp;</td><td><span>非空，20</span></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td><span>2000</span></td></tr><tr><td><span>备注</span></td><td><span>外键</span></td><td><span>外键</span></td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr></tbody></table></figure><p><span>图书的操作类型有：入库、损失、出库</span></p><p><span>采用图书+管理者+操作时间作为联合主键</span></p><p>&nbsp;</p><h2><a name="应用系统模块设计功能点描述" class="md-header-anchor"></a><span>应用系统模块设计、功能点描述</span></h2><p><span>功能整体分为两块：读者的操作（借书还书等）、管理员的操作（查看/修改-图书/借阅数据）</span></p><p>&nbsp;</p><p>&nbsp;</p><p><span>图例：</span></p><div class="md-diagram-panel"><svg id="mermaidChart2" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 220.765625px;" viewBox="0 0 220.765625 146"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"></g><g class="edgeLabels"></g><g class="nodes"><g class="node" id="A" transform="translate(122.3828125,40)" style="opacity: 1;"><rect rx="0" ry="0" x="-82" y="-20" width="164" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-72,-10)"><foreignObject width="144.00390625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">矩形代表实际网页</div></foreignObject></g></g></g><g class="node" id="B" transform="translate(122.3828125,130)" style="opacity: 1;"><rect rx="5" ry="5" x="-102.3828125" y="-20" width="204.765625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-92.3828125,-10)"><foreignObject width="184.765625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">圆框代表执行操作的url</div></foreignObject></g></g></g></g></g></g></svg></div><h3><a name="读者功能-登录" class="md-header-anchor"></a><span>读者功能-登录</span></h3><p><span>登录是读者端的基本功能，在用户的入口</span><code>user</code><span>网页中，有三种情况：</span></p><ul><li><span>新用户进入网页：显示为一个登录输入账号密码的框，用来进行登录</span></li><li><span>登录成功以后：界面显示登录成功，且用户可以使用登录后的功能</span></li><li><span>登录有误：显示登录有误，并再次显示登录框</span></li></ul><div class="md-diagram-panel"><svg id="mermaidChart3" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 583.1875px;" viewBox="0 0 583.1875 123.5"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M173.125,55.80901356881327L277.9296875,31.25L387.5344669117647,53.75" marker-end="url(#arrowhead61)" style="fill:none"></path><defs><marker id="arrowhead61" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M382.734375,73.75L277.9296875,73.75L173.125,73.75" marker-end="url(#arrowhead62)" style="fill:none"></path><defs><marker id="arrowhead62" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M387.5344669117647,93.75L277.9296875,116.25L173.125,91.69098643118673" marker-end="url(#arrowhead63)" style="fill:none"></path><defs><marker id="arrowhead63" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(277.9296875,31.25)" style="opacity: 1;"><g transform="translate(-23.203125,-11.25)" class="label"><foreignObject width="46.40625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(277.9296875,73.75)" style="opacity: 1;"><g transform="translate(-36,-11.25)" class="label"><foreignObject width="72.01171875" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>登录成功</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(277.9296875,116.25)" style="opacity: 1;"><g transform="translate(-79.8046875,-11.25)" class="label"><foreignObject width="159.609375" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>登录失败GET发消息</span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="U" transform="translate(96.5625,73.75)" style="opacity: 1;"><rect rx="0" ry="0" x="-76.5625" y="-20" width="153.125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-66.5625,-10)"><foreignObject width="133.125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户界面'/user/'</div></foreignObject></g></g></g><g class="node" id="ULI" transform="translate(484.9609375,73.75)" style="opacity: 1;"><rect rx="5" ry="5" x="-102.2265625" y="-20" width="204.453125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-92.2265625,-10)"><foreignObject width="184.453125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户登录'/user/login/'</div></foreignObject></g></g></g></g></g></g></svg></div><h3><a name="读者功能-退出登录" class="md-header-anchor"></a><span>读者功能-退出登录</span></h3><p><span>在登录后，点击退出登录按钮即可退出登录，重新回到初始登录界面</span></p><div class="md-diagram-panel"><svg id="mermaidChart4" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 508.03125px;" viewBox="0 0 508.03125 81"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M173.125,40.63390313390313L233.671875,31.25L294.21875,38.8427846934071" marker-end="url(#arrowhead74)" style="fill:none"></path><defs><marker id="arrowhead74" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M294.21875,66.1572153065929L233.671875,73.75L173.125,64.36609686609687" marker-end="url(#arrowhead75)" style="fill:none"></path><defs><marker id="arrowhead75" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(233.671875,31.25)" style="opacity: 1;"><g transform="translate(-23.203125,-11.25)" class="label"><foreignObject width="46.40625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(233.671875,73.75)" style="opacity: 1;"><g transform="translate(-35.546875,-11.25)" class="label"><foreignObject width="71.09375" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>Redirect</span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="U" transform="translate(96.5625,52.5)" style="opacity: 1;"><rect rx="0" ry="0" x="-76.5625" y="-20" width="153.125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-66.5625,-10)"><foreignObject width="133.125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户界面'/user/'</div></foreignObject></g></g></g><g class="node" id="ULO" transform="translate(403.125,52.5)" style="opacity: 1;"><rect rx="5" ry="5" x="-108.90625" y="-20" width="217.8125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-98.90625,-10)"><foreignObject width="197.8125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户登出'/user/logout/'</div></foreignObject></g></g></g></g></g></g></svg></div><h3><a name="读者功能-修改密码" class="md-header-anchor"></a><span>读者功能-修改密码</span></h3><p><span>在登录之后，如果想修改密码，可以在修改密码的界面修改密码，会有几种情况：</span></p><ul><li><span>两次新密码不一致：页面内通过JS识别并提示，禁止提交修改</span></li><li><span>旧密码不正确：在判定之后返回修改页，提示密码错误</span></li><li><span>成功：返回user重新登录</span></li></ul><div class="md-diagram-panel"><svg id="mermaidChart5" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 1039.46875px;" viewBox="0 0 1039.46875 129.75"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M168.75589622641508,65.625L216.1328125,52.5L259.140625,52.5" marker-end="url(#arrowhead97)" style="fill:none"></path><defs><marker id="arrowhead97" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M572.765625,38.34132780082987L651.3046875,31.25L775.9025735294117,53.75" marker-end="url(#arrowhead98)" style="fill:none"></path><defs><marker id="arrowhead98" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M790.1017628205128,93.75L651.3046875,122.5L415.953125,122.5L216.1328125,122.5L161.41419491525426,105.625" marker-end="url(#arrowhead99)" style="fill:none"></path><defs><marker id="arrowhead99" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M729.84375,73.75L651.3046875,73.75L572.765625,66.65867219917013" marker-end="url(#arrowhead100)" style="fill:none"></path><defs><marker id="arrowhead100" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(216.1328125,52.5)" style="opacity: 1;"><g transform="translate(-18.0078125,-11.25)" class="label"><foreignObject width="36.015625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>跳转</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(651.3046875,31.25)" style="opacity: 1;"><g transform="translate(-23.203125,-11.25)" class="label"><foreignObject width="46.40625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(415.953125,122.5)" style="opacity: 1;"><g transform="translate(-53.5390625,-11.25)" class="label"><foreignObject width="107.08984375" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>成功Redirect</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(651.3046875,73.75)" style="opacity: 1;"><g transform="translate(-53.5390625,-11.25)" class="label"><foreignObject width="107.08984375" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>失败Redirect</span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="U" transform="translate(96.5625,85.625)" style="opacity: 1;"><rect rx="0" ry="0" x="-76.5625" y="-20" width="153.125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-66.5625,-10)"><foreignObject width="133.125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户界面'/user/'</div></foreignObject></g></g></g><g class="node" id="UCP1" transform="translate(415.953125,52.5)" style="opacity: 1;"><rect rx="0" ry="0" x="-156.8125" y="-20" width="313.625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-146.8125,-10)"><foreignObject width="293.6328125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户注册'/user/change-password/'</div></foreignObject></g></g></g><g class="node" id="UCP2" transform="translate(886.65625,73.75)" style="opacity: 1;"><rect rx="5" ry="5" x="-156.8125" y="-20" width="313.625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-146.8125,-10)"><foreignObject width="293.6328125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户注册'/user/change-password/'</div></foreignObject></g></g></g></g></g></g></svg></div><h3><a name="读者功能-校外注册" class="md-header-anchor"></a><span>读者功能-校外注册</span></h3><p><span>对于校外读者，可以进行注册，填写信息注册之后回到初始登录界面，然后就可以用注册的账号登录了；如果注册信息有问题则返回注册页面。</span></p><p><span>注：对于校外注册，初始权限设置为禁用，需要等待管理员授权才可以进行借阅操作。</span></p><div class="md-diagram-panel"><svg id="mermaidChart6" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 850.5px;" viewBox="0 0 850.5 129.75"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M168.75589622641508,65.625L216.1328125,52.5L259.140625,52.5" marker-end="url(#arrowhead122)" style="fill:none"></path><defs><marker id="arrowhead122" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M478.28125,40.122258908547224L556.8203125,31.25L656.4076286764706,53.75" marker-end="url(#arrowhead123)" style="fill:none"></path><defs><marker id="arrowhead123" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M667.7566105769231,93.75L556.8203125,122.5L368.7109375,122.5L216.1328125,122.5L161.41419491525426,105.625" marker-end="url(#arrowhead124)" style="fill:none"></path><defs><marker id="arrowhead124" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M635.359375,73.75L556.8203125,73.75L478.28125,64.87774109145278" marker-end="url(#arrowhead125)" style="fill:none"></path><defs><marker id="arrowhead125" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(216.1328125,52.5)" style="opacity: 1;"><g transform="translate(-18.0078125,-11.25)" class="label"><foreignObject width="36.015625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>跳转</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(556.8203125,31.25)" style="opacity: 1;"><g transform="translate(-23.203125,-11.25)" class="label"><foreignObject width="46.40625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(368.7109375,122.5)" style="opacity: 1;"><g transform="translate(-53.5390625,-11.25)" class="label"><foreignObject width="107.08984375" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>成功Redirect</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(556.8203125,73.75)" style="opacity: 1;"><g transform="translate(-53.5390625,-11.25)" class="label"><foreignObject width="107.08984375" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>失败Redirect</span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="U" transform="translate(96.5625,85.625)" style="opacity: 1;"><rect rx="0" ry="0" x="-76.5625" y="-20" width="153.125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-66.5625,-10)"><foreignObject width="133.125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户界面'/user/'</div></foreignObject></g></g></g><g class="node" id="USU1" transform="translate(368.7109375,52.5)" style="opacity: 1;"><rect rx="0" ry="0" x="-109.5703125" y="-20" width="219.140625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-99.5703125,-10)"><foreignObject width="199.140625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户注册'/user/signup/'</div></foreignObject></g></g></g><g class="node" id="USU2" transform="translate(744.9296875,73.75)" style="opacity: 1;"><rect rx="5" ry="5" x="-109.5703125" y="-20" width="219.140625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-99.5703125,-10)"><foreignObject width="199.140625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户注册'/user/signup/'</div></foreignObject></g></g></g></g></g></g></svg></div><p>&nbsp;</p><h3><a name="读者功能-图书信息查询" class="md-header-anchor"></a><span>读者功能-图书信息查询</span></h3><p><span>在这个界面，可以根据关键词查找匹配有关的书，按照5个一页的方式展示在页面中。</span>
<span>如果想要重新搜索，可以点击链接返回到搜索界面。</span></p><div class="md-diagram-panel"><svg id="mermaidChart7" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 994.390625px;" viewBox="0 0 994.390625 123.5"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M173.125,73.75L216.1328125,73.75L259.140625,73.75" marker-end="url(#arrowhead145)" style="fill:none"></path><defs><marker id="arrowhead145" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M459.58639705882354,53.75L563.4296875,31.25L701.8625919117648,53.75" marker-end="url(#arrowhead146)" style="fill:none"></path><defs><marker id="arrowhead146" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M651.4375,73.75L563.4296875,73.75L475.421875,73.75" marker-end="url(#arrowhead147)" style="fill:none"></path><defs><marker id="arrowhead147" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M701.8625919117648,93.75L563.4296875,116.25L459.58639705882354,93.75" marker-end="url(#arrowhead148)" style="fill:none"></path><defs><marker id="arrowhead148" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(216.1328125,73.75)" style="opacity: 1;"><g transform="translate(-18.0078125,-11.25)" class="label"><foreignObject width="36.015625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>跳转</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(563.4296875,31.25)" style="opacity: 1;"><g transform="translate(-16.8046875,-11.25)" class="label"><foreignObject width="33.61328125" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>GET</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(563.4296875,73.75)" style="opacity: 1;"><g transform="translate(-36,-11.25)" class="label"><foreignObject width="72.01171875" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>显示信息</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(563.4296875,116.25)" style="opacity: 1;"><g transform="translate(-63.0078125,-11.25)" class="label"><foreignObject width="126.015625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>点击返回查找页</span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="U" transform="translate(96.5625,73.75)" style="opacity: 1;"><rect rx="0" ry="0" x="-76.5625" y="-20" width="153.125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-66.5625,-10)"><foreignObject width="133.125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户界面'/user/'</div></foreignObject></g></g></g><g class="node" id="USR1" transform="translate(367.28125,73.75)" style="opacity: 1;"><rect rx="0" ry="0" x="-108.140625" y="-20" width="216.28125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-98.140625,-10)"><foreignObject width="196.2890625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户注册'/user/search/'</div></foreignObject></g></g></g><g class="node" id="USR2" transform="translate(824.9140625,73.75)" style="opacity: 1;"><rect rx="5" ry="5" x="-173.4765625" y="-20" width="346.953125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-163.4765625,-10)"><foreignObject width="326.953125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户注册'/user/search/?Bname=&amp;?p='</div></foreignObject></g></g></g></g></g></g></svg></div><h3><a name="读者功能-图书借阅" class="md-header-anchor"></a><span>读者功能-图书借阅</span></h3><p><span>在图书查找的过程中，可以通过点击借书按钮，把某书添加到借阅列表（这里的设计参照购物车的概念）</span>
<span>，而后可以继续查找借阅，或者点击确认借书。</span></p><div class="md-diagram-panel"><svg id="mermaidChart8" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 1321.53125px;" viewBox="0 0 1321.53125 113.5"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M222.53685141509433,53.125L284.484375,40L332.6875,40" marker-end="url(#arrowhead173)" style="fill:none"></path><defs><marker id="arrowhead173" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M606.828125,40L667.828125,40L734.685141509434,53.125" marker-end="url(#arrowhead174)" style="fill:none"></path><defs><marker id="arrowhead174" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M734.685141509434,93.125L667.828125,106.25L469.7578125,106.25L284.484375,106.25L222.53685141509433,93.125" marker-end="url(#arrowhead175)" style="fill:none"></path><defs><marker id="arrowhead175" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M944.296875,73.125L1010.4921875,73.125L1076.6875,73.125" marker-end="url(#arrowhead176)" style="fill:none"></path><defs><marker id="arrowhead176" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(284.484375,40)" style="opacity: 1;"><g transform="translate(-23.203125,-11.25)" class="label"><foreignObject width="46.40625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(667.828125,40)" style="opacity: 1;"><g transform="translate(-36,-11.25)" class="label"><foreignObject width="72.01171875" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>显示信息</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(469.7578125,106.25)" style="opacity: 1;"><g transform="translate(-63.0078125,-11.25)" class="label"><foreignObject width="126.015625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>点击继续查找页</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(1010.4921875,73.125)" style="opacity: 1;"><g transform="translate(-41.1953125,-11.25)" class="label"><foreignObject width="82.40234375" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST借阅</span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="USR1" transform="translate(128.140625,73.125)" style="opacity: 1;"><rect rx="0" ry="0" x="-108.140625" y="-20" width="216.28125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-98.140625,-10)"><foreignObject width="196.2890625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户注册'/user/search/'</div></foreignObject></g></g></g><g class="node" id="UAdd" transform="translate(469.7578125,40)" style="opacity: 1;"><rect rx="5" ry="5" x="-137.0703125" y="-20" width="274.140625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-127.0703125,-10)"><foreignObject width="254.140625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">添加进列表'user/borrow/add/'</div></foreignObject></g></g></g><g class="node" id="UBR" transform="translate(836.5625,73.125)" style="opacity: 1;"><rect rx="0" ry="0" x="-107.734375" y="-20" width="215.46875" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-97.734375,-10)"><foreignObject width="195.46875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">借阅列表'user/borrow/'</div></foreignObject></g></g></g><g class="node" id="UBRact" transform="translate(1201.109375,73.125)" style="opacity: 1;"><rect rx="5" ry="5" x="-124.421875" y="-20" width="248.84375" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-114.421875,-10)"><foreignObject width="228.84765625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">借阅处理'user/borrow/act/'</div></foreignObject></g></g></g></g></g></g></svg></div><h3><a name="读者功能-图书归还延期" class="md-header-anchor"></a><span>读者功能-图书归还&amp;延期</span></h3><p><span>这个界面列出了用户所有的正在借阅图书，对于这些书，如果没有延期，则可以通过延期按钮续借7天，否则就只可以进行还书操作。</span></p><div class="md-diagram-panel"><svg id="mermaidChart9" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 663.078125px;" viewBox="0 0 663.078125 171"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M196.21255896226415,77.5L335.8515625,31.25L420.046875,39.863655169819836" marker-end="url(#arrowhead192)" style="fill:none"></path><defs><marker id="arrowhead192" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M251.65625,109.8052962543452L335.8515625,118.75L420.046875,128.37702636626923" marker-end="url(#arrowhead193)" style="fill:none"></path><defs><marker id="arrowhead193" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M420.046875,155.13634483018018L335.8515625,163.75L196.21255896226415,117.5" marker-end="url(#arrowhead194)" style="fill:none"></path><defs><marker id="arrowhead194" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M420.046875,66.62297363373077L335.8515625,76.25L251.65625,85.1947037456548" marker-end="url(#arrowhead195)" style="fill:none"></path><defs><marker id="arrowhead195" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(335.8515625,31.25)" style="opacity: 1;"><g transform="translate(-59.1953125,-11.25)" class="label"><foreignObject width="118.3984375" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST延期书号</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(335.8515625,118.75)" style="opacity: 1;"><g transform="translate(-59.1953125,-11.25)" class="label"><foreignObject width="118.3984375" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST还书书号</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(335.8515625,163.75)" style="opacity: 1;"><g transform="translate(-35.546875,-11.25)" class="label"><foreignObject width="71.09375" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>Redirect</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(335.8515625,76.25)" style="opacity: 1;"><g transform="translate(-35.546875,-11.25)" class="label"><foreignObject width="71.09375" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>Redirect</span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="UR" transform="translate(135.828125,97.5)" style="opacity: 1;"><rect rx="0" ry="0" x="-115.828125" y="-20" width="231.65625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-105.828125,-10)"><foreignObject width="211.66015625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">还书和延期'/user/return/'</div></foreignObject></g></g></g><g class="node" id="URact" transform="translate(543.5625,142.5)" style="opacity: 1;"><rect rx="5" ry="5" x="-123.515625" y="-20" width="247.03125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-113.515625,-10)"><foreignObject width="227.03125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">点击还书'/user/return/act/'</div></foreignObject></g></g></g><g class="node" id="URadd" transform="translate(543.5625,52.5)" style="opacity: 1;"><rect rx="5" ry="5" x="-123.515625" y="-20" width="247.03125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-113.515625,-10)"><foreignObject width="227.03125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">点击延期'/user/return/act/'</div></foreignObject></g></g></g></g></g></g></svg></div><h3><a name="管理功能-管理员登录与登出" class="md-header-anchor"></a><span>管理功能-管理员登录与登出</span></h3><p><span>管理员方面的登录和读者的登录类似，在入口</span><code>admin</code><span>网页中，有三种情况：</span></p><ul><li><span>初始进入网页：显示为一个登录输入账号密码的框，用来进行登录</span></li><li><span>登录成功以后：界面显示登录成功，且用户可以使用登录后的功能</span></li><li><span>登录有误：显示登录有误，并再次显示登录框</span></li></ul><p><span>登出也是类似的原理</span></p><div class="md-diagram-panel"><svg id="mermaidChart10" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 631.921875px;" viewBox="0 0 631.921875 208.5"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M151.51799242424244,93.75L295.6171875,31.25L413.44025735294116,53.75" marker-end="url(#arrowhead214)" style="fill:none"></path><defs><marker id="arrowhead214" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M407.1015625,73.75L295.6171875,73.75L190.8125,95.78967634616174" marker-end="url(#arrowhead215)" style="fill:none"></path><defs><marker id="arrowhead215" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M413.44025735294116,93.75L295.6171875,116.25L190.8125,114.87252022836489" marker-end="url(#arrowhead216)" style="fill:none"></path><defs><marker id="arrowhead216" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M189.94444444444446,133.75L295.6171875,158.75L400.421875,169.93426826271633" marker-end="url(#arrowhead217)" style="fill:none"></path><defs><marker id="arrowhead217" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M400.421875,192.42031452943448L295.6171875,201.25L148.8830357142857,133.75" marker-end="url(#arrowhead218)" style="fill:none"></path><defs><marker id="arrowhead218" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(295.6171875,31.25)" style="opacity: 1;"><g transform="translate(-23.203125,-11.25)" class="label"><foreignObject width="46.40625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(295.6171875,73.75)" style="opacity: 1;"><g transform="translate(-36,-11.25)" class="label"><foreignObject width="72.01171875" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>登录成功</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(295.6171875,116.25)" style="opacity: 1;"><g transform="translate(-79.8046875,-11.25)" class="label"><foreignObject width="159.609375" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>登录失败GET发消息</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(295.6171875,158.75)" style="opacity: 1;"><g transform="translate(-23.203125,-11.25)" class="label"><foreignObject width="46.40625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(295.6171875,201.25)" style="opacity: 1;"><g transform="translate(-35.546875,-11.25)" class="label"><foreignObject width="71.09375" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>Redirect</span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="A" transform="translate(105.40625,113.75)" style="opacity: 1;"><rect rx="0" ry="0" x="-85.40625" y="-20" width="170.8125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-75.40625,-10)"><foreignObject width="150.8203125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">管理界面'/admin/'</div></foreignObject></g></g></g><g class="node" id="ALI" transform="translate(518.171875,73.75)" style="opacity: 1;"><rect rx="5" ry="5" x="-111.0703125" y="-20" width="222.140625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-101.0703125,-10)"><foreignObject width="202.1484375" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户登录'/admin/login/'</div></foreignObject></g></g></g><g class="node" id="ALO" transform="translate(518.171875,182.5)" style="opacity: 1;"><rect rx="5" ry="5" x="-117.75" y="-20" width="235.5" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-107.75,-10)"><foreignObject width="215.5078125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户登出'/admin/logout/'</div></foreignObject></g></g></g></g></g></g></svg></div><h3><a name="管理功能-用户管理" class="md-header-anchor"></a><span>管理功能-用户管理</span></h3><p><span>页面有三个内容：</span></p><ul><li><span>显示被禁的账号情况，可以点击解禁</span></li><li><span>提供一个检测功能，点击按钮可以根据日期筛选逾期未还的账号，进行封号处理</span></li><li><span>提供一个当前账号的数量汇总图【完成老师对于表和图同一网页的加分要求】</span></li></ul><div class="md-diagram-panel"><svg id="mermaidChart11" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 1148.796875px;" viewBox="0 0 1148.796875 146"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M190.8125,102.85356347438753L287.8125,81.25L409.1985576923077,101.875" marker-end="url(#arrowhead241)" style="fill:none"></path><defs><marker id="arrowhead241" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M384.8125,122.98931512220625L287.8125,123.75L190.8125,122.75291245502827" marker-end="url(#arrowhead242)" style="fill:none"></path><defs><marker id="arrowhead242" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M573.3909828244275,101.875L717.203125,40L779.6640625,40" marker-end="url(#arrowhead243)" style="fill:none"></path><defs><marker id="arrowhead243" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M648.69625,101.875L717.203125,90.625L836.2325148809524,110" marker-end="url(#arrowhead244)" style="fill:none"></path><defs><marker id="arrowhead244" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M765.40625,123.49406953460581L717.203125,121.875L669,121.875" marker-end="url(#arrowhead245)" style="fill:none"></path><defs><marker id="arrowhead245" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M765.40625,139.5086676032684L717.203125,141.875L669,136.80890261926265" marker-end="url(#arrowhead246)" style="fill:none"></path><defs><marker id="arrowhead246" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(287.8125,81.25)" style="opacity: 1;"><g transform="translate(-36,-11.25)" class="label"><foreignObject width="72.01171875" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>进入界面</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(287.8125,123.75)" style="opacity: 1;"><g transform="translate(-72,-11.25)" class="label"><foreignObject width="144.00390625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>没有用户管理权限</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(717.203125,40)" style="opacity: 1;"><g transform="translate(-23.203125,-11.25)" class="label"><foreignObject width="46.40625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(717.203125,90.625)" style="opacity: 1;"><g transform="translate(-23.203125,-11.25)" class="label"><foreignObject width="46.40625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST</span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="A" transform="translate(105.40625,121.875)" style="opacity: 1;"><rect rx="0" ry="0" x="-85.40625" y="-20" width="170.8125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-75.40625,-10)"><foreignObject width="150.8203125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">管理界面'/admin/'</div></foreignObject></g></g></g><g class="node" id="AU" transform="translate(526.90625,121.875)" style="opacity: 1;"><rect rx="0" ry="0" x="-142.09375" y="-20" width="284.1875" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-132.09375,-10)"><foreignObject width="264.19921875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户管理'/admin/user-control/'</div></foreignObject></g></g></g><g class="node" id="AF" transform="translate(959.1015625,40)" style="opacity: 1;"><rect rx="5" ry="5" x="-179.4375" y="-20" width="358.875" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-169.4375,-10)"><foreignObject width="338.88671875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户解禁'/admin/user-control/free-act/'</div></foreignObject></g></g></g><g class="node" id="ARS" transform="translate(959.1015625,130)" style="opacity: 1;"><rect rx="5" ry="5" x="-193.6953125" y="-20" width="387.390625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-183.6953125,-10)"><foreignObject width="367.40234375" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">用户逾期检测'/admin/user-control/restrict/'</div></foreignObject></g></g></g></g></g></g></svg></div><h3><a name="管理功能-图书管理" class="md-header-anchor"></a><span>管理功能-图书管理</span></h3><p><span>图书管理页面展示了图书（在库和下架分别显示）。</span></p><p><span>对于在库图书提供下架按钮，对于下架图书提供上架（并输入数目）按钮</span></p><p><span>此外可以在子页面输入新书的全部信息来实现新书上架。</span></p><div class="md-diagram-panel"><svg id="mermaidChart12" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 1133.671875px;" viewBox="0 0 1133.671875 242.875"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M190.8125,111.30032550967962L287.8125,100L384.8125,108.48523830964173" marker-end="url(#arrowhead270)" style="fill:none"></path><defs><marker id="arrowhead270" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M384.8125,134.01476169035826L287.8125,142.5L190.8125,131.19967449032038" marker-end="url(#arrowhead271)" style="fill:none"></path><defs><marker id="arrowhead271" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M573.8732638888889,101.25L724.859375,31.25L773.0625,34.51745466870022" marker-end="url(#arrowhead272)" style="fill:none"></path><defs><marker id="arrowhead272" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M676.65625,121.25L724.859375,121.25L784.421875,125.28745127944416" marker-end="url(#arrowhead273)" style="fill:none"></path><defs><marker id="arrowhead273" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M567.4917714497042,141.25L724.859375,226.875L780.109375,226.875" marker-end="url(#arrowhead274)" style="fill:none"></path><defs><marker id="arrowhead274" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M798.4256981382979,66.875L724.859375,76.25L617.0121527777778,101.25" marker-end="url(#arrowhead275)" style="fill:none"></path><defs><marker id="arrowhead275" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M823.6484375,156.875L724.859375,171.875L607.4257330246913,141.25" marker-end="url(#arrowhead276)" style="fill:none"></path><defs><marker id="arrowhead276" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(287.8125,100)" style="opacity: 1;"><g transform="translate(-36,-11.25)" class="label"><foreignObject width="72.01171875" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>进入界面</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(287.8125,142.5)" style="opacity: 1;"><g transform="translate(-72,-11.25)" class="label"><foreignObject width="144.00390625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>没有图书管理权限</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(724.859375,31.25)" style="opacity: 1;"><g transform="translate(-23.203125,-11.25)" class="label"><foreignObject width="46.40625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(724.859375,121.25)" style="opacity: 1;"><g transform="translate(-23.203125,-11.25)" class="label"><foreignObject width="46.40625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST</span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="A" transform="translate(105.40625,121.25)" style="opacity: 1;"><rect rx="0" ry="0" x="-85.40625" y="-20" width="170.8125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-75.40625,-10)"><foreignObject width="150.8203125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">管理界面'/admin/'</div></foreignObject></g></g></g><g class="node" id="AB" transform="translate(530.734375,121.25)" style="opacity: 1;"><rect rx="0" ry="0" x="-145.921875" y="-20" width="291.84375" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-135.921875,-10)"><foreignObject width="271.85546875" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">图书管理'/admin/book-control/'</div></foreignObject></g></g></g><g class="node" id="AB1" transform="translate(955.3671875,46.875)" style="opacity: 1;"><rect rx="5" ry="5" x="-182.3046875" y="-20" width="364.609375" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-172.3046875,-10)"><foreignObject width="344.609375" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">图书下架'/admin/book-control/remove/'</div></foreignObject></g></g></g><g class="node" id="AB2" transform="translate(955.3671875,136.875)" style="opacity: 1;"><rect rx="5" ry="5" x="-170.9453125" y="-20" width="341.890625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-160.9453125,-10)"><foreignObject width="321.89453125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">图书上架'/admin/book-control/reset/'</div></foreignObject></g></g></g><g class="node" id="AB3" transform="translate(955.3671875,226.875)" style="opacity: 1;"><rect rx="0" ry="0" x="-175.2578125" y="-20" width="350.515625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-165.2578125,-10)"><foreignObject width="330.52734375" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">新图书上架'/admin/book-control/add/'</div></foreignObject></g></g></g></g></g></g></svg></div><h3><a name="管理功能-超级管理员" class="md-header-anchor"></a><span>管理功能-超级管理员</span></h3><p><span>提供了这样一个界面，对于具有超级管理员权限的用户，可以在这个页查看所有U/B两个实体表的修改记录。</span>
<span>这个页面支持账号权限的验证，同时可以向前向后翻页看，每页显示5条数据。</span></p><div class="md-diagram-panel"><svg id="mermaidChart13" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 1070.59375px;" viewBox="0 0 1070.59375 81"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M190.8125,41.46098650446683L269.8125,31.25L348.8125,38.55064893147148" marker-end="url(#arrowhead296)" style="fill:none"></path><defs><marker id="arrowhead296" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M348.8125,66.44935106852853L269.8125,73.75L190.8125,63.53901349553317" marker-end="url(#arrowhead297)" style="fill:none"></path><defs><marker id="arrowhead297" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M650.703125,37.36596446606952L711.703125,31.25L772.703125,37.36596446606952" marker-end="url(#arrowhead298)" style="fill:none"></path><defs><marker id="arrowhead298" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M772.703125,67.63403553393049L711.703125,73.75L650.703125,67.63403553393049" marker-end="url(#arrowhead299)" style="fill:none"></path><defs><marker id="arrowhead299" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(269.8125,31.25)" style="opacity: 1;"><g transform="translate(-18.0078125,-11.25)" class="label"><foreignObject width="36.015625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>跳转</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(269.8125,73.75)" style="opacity: 1;"><g transform="translate(-54,-11.25)" class="label"><foreignObject width="108.0078125" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>未登录则回转</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(711.703125,31.25)" style="opacity: 1;"><g transform="translate(-34.8046875,-11.25)" class="label"><foreignObject width="69.609375" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>GET页码</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(711.703125,73.75)" style="opacity: 1;"><g transform="translate(-36,-11.25)" class="label"><foreignObject width="72.01171875" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>数据显示</span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="A" transform="translate(105.40625,52.5)" style="opacity: 1;"><rect rx="0" ry="0" x="-85.40625" y="-20" width="170.8125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-75.40625,-10)"><foreignObject width="150.8203125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">管理界面'/admin/'</div></foreignObject></g></g></g><g class="node" id="AA1" transform="translate(499.7578125,52.5)" style="opacity: 1;"><rect rx="0" ry="0" x="-150.9453125" y="-20" width="301.890625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-140.9453125,-10)"><foreignObject width="281.89453125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">数据展现'/admin/admin-control/'</div></foreignObject></g></g></g><g class="node" id="AA2" transform="translate(923.6484375,52.5)" style="opacity: 1;"><rect rx="5" ry="5" x="-150.9453125" y="-20" width="301.890625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-140.9453125,-10)"><foreignObject width="281.89453125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">数据展现'/admin/admin-control/'</div></foreignObject></g></g></g></g></g></g></svg></div><h3><a name="管理功能-数据展示" class="md-header-anchor"></a><span>管理功能-数据展示</span></h3><p><span>提供了一个界面，通过选择标签，可以查看该标签下的图书数量，以Echarts动态JS呈现出来</span></p><div class="md-diagram-panel"><svg id="mermaidChart14" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 828.109375px;" viewBox="0 0 828.109375 81"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M190.8125,52.5L233.8203125,52.5L276.828125,52.5" marker-end="url(#arrowhead316)" style="fill:none"></path><defs><marker id="arrowhead316" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M493.46875,38.905608360633046L554.46875,31.25L615.46875,38.905608360633046" marker-end="url(#arrowhead317)" style="fill:none"></path><defs><marker id="arrowhead317" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M615.46875,66.09439163936696L554.46875,73.75L493.46875,66.09439163936696" marker-end="url(#arrowhead318)" style="fill:none"></path><defs><marker id="arrowhead318" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(233.8203125,52.5)" style="opacity: 1;"><g transform="translate(-18.0078125,-11.25)" class="label"><foreignObject width="36.015625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>跳转</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(554.46875,31.25)" style="opacity: 1;"><g transform="translate(-23.203125,-11.25)" class="label"><foreignObject width="46.40625" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>POST</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(554.46875,73.75)" style="opacity: 1;"><g transform="translate(-36,-11.25)" class="label"><foreignObject width="72.01171875" height="22.5"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>数据显示</span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="A" transform="translate(105.40625,52.5)" style="opacity: 1;"><rect rx="0" ry="0" x="-85.40625" y="-20" width="170.8125" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-75.40625,-10)"><foreignObject width="150.8203125" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">管理界面'/admin/'</div></foreignObject></g></g></g><g class="node" id="AD1" transform="translate(385.1484375,52.5)" style="opacity: 1;"><rect rx="0" ry="0" x="-108.3203125" y="-20" width="216.640625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-98.3203125,-10)"><foreignObject width="196.640625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">数据展现'/admin/data/'</div></foreignObject></g></g></g><g class="node" id="AD2" transform="translate(723.7890625,52.5)" style="opacity: 1;"><rect rx="5" ry="5" x="-108.3203125" y="-20" width="216.640625" height="40"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-98.3203125,-10)"><foreignObject width="196.640625" height="20"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 20px; white-space: nowrap;">数据展现'/admin/data/'</div></foreignObject></g></g></g></g></g></g></svg></div><h2><a name="系统描述实现" class="md-header-anchor"></a><span>系统描述实现</span></h2><h3><a name="python环境" class="md-header-anchor"></a><span>python环境</span></h3><p><span>使用的是venv虚拟环境，python为3.7版本</span></p><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang=""><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang=""><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 36px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 28px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>1</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -28px; width: 28px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">pip freeze &gt; requirements.txt</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 22px;"></div><div class="CodeMirror-gutters" style="height: 22px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 27px;"></div></div></div></div></pre><p><span>安装的依赖项使用这个方法导出到文件中，可以直接用指令安装</span></p><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang=""><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang=""><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 36px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 28px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>1</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -28px; width: 28px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">pip install -r requirements/requirements.txt</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 22px;"></div><div class="CodeMirror-gutters" style="height: 22px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 27px;"></div></div></div></div></pre><p><span>项目使用的库基本是常见的库，所以可以不安装虚拟环境（requirements里面有一些是和项目无关的库，比如jupyter）</span></p><p><span>需要用到的包：</span></p><ul><li><span>json：处理JS，从而将参数可以传递到模板的JS里面</span></li><li><span>datetime：处理日期数据，从而检查图书借阅逾期的问题</span></li></ul><h3><a name="数据库配置" class="md-header-anchor"></a><span>数据库配置</span></h3><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="mssql"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="mssql"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 45px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 37px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>10</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -37px; width: 37px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">CREATE</span> <span class="cm-builtin">TABLE</span> UserList</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">(</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Uno <span class="cm-builtin">char</span>(<span class="cm-number">11</span>) <span class="cm-keyword">PRIMARY</span> <span class="cm-keyword">KEY</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Uname <span class="cm-builtin">nvarchar</span>(<span class="cm-number">10</span>) <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Upassword <span class="cm-builtin">char</span>(<span class="cm-number">32</span>) <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">6</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Utype <span class="cm-builtin">nvarchar</span>(<span class="cm-number">10</span>) <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">7</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Uget <span class="cm-builtin">int</span> <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">8</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  more <span class="cm-builtin">nvarchar</span>(<span class="cm-number">2000</span>),</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">9</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Urestrict <span class="cm-builtin">bit</span> <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">10</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">)</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 224px;"></div><div class="CodeMirror-gutters" style="height: 224px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 36px;"></div></div></div></div></pre><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="mssql"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="mssql"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 45px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 37px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>12</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -37px; width: 37px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">CREATE</span> <span class="cm-builtin">TABLE</span> Book(</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Bno <span class="cm-builtin">char</span>(<span class="cm-number">13</span>) <span class="cm-keyword">PRIMARY</span> <span class="cm-keyword">KEY</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Bname <span class="cm-builtin">nvarchar</span>(<span class="cm-number">100</span>) <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  brief <span class="cm-builtin">nvarchar</span>(<span class="cm-number">1000</span>) <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Btype <span class="cm-builtin">nvarchar</span>(<span class="cm-number">20</span>),</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">6</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  author <span class="cm-builtin">nvarchar</span>(<span class="cm-number">100</span>) <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">7</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Press <span class="cm-builtin">nvarchar</span>(<span class="cm-number">100</span>) <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">8</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  price <span class="cm-builtin">numeric</span>(<span class="cm-number">5</span>,<span class="cm-number">2</span>) <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">9</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  num <span class="cm-builtin">int</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">10</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  more <span class="cm-builtin">nvarchar</span>(<span class="cm-number">2000</span>),</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">11</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  removed <span class="cm-builtin">bit</span> <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">12</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">)</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 269px;"></div><div class="CodeMirror-gutters" style="height: 269px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 36px;"></div></div></div></div></pre><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="mssql"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="mssql"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 36px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 28px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>6</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -28px; width: 28px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">CREATE</span> <span class="cm-builtin">TABLE</span> AdminList(</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Ano <span class="cm-builtin">char</span>(<span class="cm-number">20</span>) <span class="cm-keyword">PRIMARY</span> <span class="cm-keyword">KEY</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Apassword <span class="cm-builtin">char</span>(<span class="cm-number">32</span>) <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text="	">    </span>Atype <span class="cm-builtin">nvarchar</span>(<span class="cm-number">10</span>) <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text="	">    </span>more <span class="cm-builtin">nvarchar</span>(<span class="cm-number">2000</span>)</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">6</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">)</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 134px;"></div><div class="CodeMirror-gutters" style="height: 134px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 27px;"></div></div></div></div></pre><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="mssql" style="break-inside: unset;"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="mssql"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 45px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 37px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>16</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -37px; width: 37px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">CREATE</span> <span class="cm-builtin">TABLE</span> Borrow(</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Uno <span class="cm-builtin">char</span>(<span class="cm-number">11</span>),</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Bno <span class="cm-builtin">char</span>(<span class="cm-number">13</span>),</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  outDate date <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  maxtime <span class="cm-builtin">int</span> <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">6</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  returnDate date,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">7</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  isReturn <span class="cm-builtin">bit</span> <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">8</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  more <span class="cm-builtin">nvarchar</span>(<span class="cm-number">2000</span>),</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">9</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">FOREIGN</span> <span class="cm-keyword">KEY</span> (Uno) REFERENCES UserList(Uno) </span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">10</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">ON</span> <span class="cm-keyword">DELETE</span> CASCADE</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">11</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">ON</span> <span class="cm-keyword">UPDATE</span> CASCADE,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">12</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">FOREIGN</span> <span class="cm-keyword">KEY</span> (Bno) REFERENCES Book(Bno) </span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">13</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">ON</span> <span class="cm-keyword">DELETE</span> CASCADE</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">14</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">ON</span> <span class="cm-keyword">UPDATE</span> CASCADE,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">15</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text="	">    </span><span class="cm-keyword">PRIMARY</span> <span class="cm-keyword">KEY</span> (Uno,Bno,outDate)</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">16</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">)</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 358px;"></div><div class="CodeMirror-gutters" style="height: 358px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 36px;"></div></div></div></div></pre><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="mssql" style="break-inside: unset;"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="mssql"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 45px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 37px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>14</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -37px; width: 37px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">CREATE</span> <span class="cm-builtin">TABLE</span> UAlter(</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Uno <span class="cm-builtin">char</span>(<span class="cm-number">11</span>),</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Ano <span class="cm-builtin">char</span>(<span class="cm-number">20</span>),</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text="	">    </span>actDate date <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text="	">    </span>AlterType <span class="cm-builtin">nvarchar</span>(<span class="cm-number">20</span>) <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">6</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text="	">    </span>more <span class="cm-builtin">nvarchar</span>(<span class="cm-number">2000</span>),</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">7</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">FOREIGN</span> <span class="cm-keyword">KEY</span> (Uno) REFERENCES UserList(Uno) </span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">8</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">ON</span> <span class="cm-keyword">DELETE</span> CASCADE</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">9</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">ON</span> <span class="cm-keyword">UPDATE</span> CASCADE,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">10</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">FOREIGN</span> <span class="cm-keyword">KEY</span> (Ano) REFERENCES AdminList(Ano) </span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">11</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">ON</span> <span class="cm-keyword">DELETE</span> CASCADE</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">12</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">ON</span> <span class="cm-keyword">UPDATE</span> CASCADE,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">13</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text="	">    </span><span class="cm-keyword">PRIMARY</span> <span class="cm-keyword">KEY</span> (Uno,Ano,actDate)</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">14</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">)</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 314px;"></div><div class="CodeMirror-gutters" style="height: 314px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 36px;"></div></div></div></div></pre><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="mssql" style="break-inside: unset;"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="mssql"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 45px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 37px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>17</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -37px; width: 37px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">CREATE</span> <span class="cm-builtin">TABLE</span> BAlter(</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Bno <span class="cm-builtin">char</span>(<span class="cm-number">13</span>),</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  Ano <span class="cm-builtin">char</span>(<span class="cm-number">20</span>),</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text="	">    </span>actDate date <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text="	">    </span>AlterType <span class="cm-builtin">nvarchar</span>(<span class="cm-number">20</span>) <span class="cm-keyword">NOT</span> <span class="cm-atom">NULL</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">6</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text="	">    </span>act <span class="cm-builtin">int</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">7</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text="	">    </span>old <span class="cm-builtin">int</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">8</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text="	">    </span>new <span class="cm-builtin">int</span>,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">9</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text="	">    </span>more <span class="cm-builtin">nvarchar</span>(<span class="cm-number">2000</span>),</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">10</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">FOREIGN</span> <span class="cm-keyword">KEY</span> (Bno) REFERENCES Book(Bno) </span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">11</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">ON</span> <span class="cm-keyword">DELETE</span> CASCADE</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">12</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">ON</span> <span class="cm-keyword">UPDATE</span> CASCADE,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">13</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">FOREIGN</span> <span class="cm-keyword">KEY</span> (Ano) REFERENCES AdminList(Ano) </span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">14</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">ON</span> <span class="cm-keyword">DELETE</span> CASCADE</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">15</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">ON</span> <span class="cm-keyword">UPDATE</span> CASCADE,</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">16</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation" cm-text="	">    </span><span class="cm-keyword">PRIMARY</span> <span class="cm-keyword">KEY</span> (Bno,Ano,actDate)</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">17</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">)</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 381px;"></div><div class="CodeMirror-gutters" style="height: 381px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 36px;"></div></div></div></div></pre><h3><a name="网页模板设计" class="md-header-anchor"></a><span>网页模板设计</span></h3><p><span>在本地</span><code>static</code><span>文件夹下载了</span><code>boostrap4</code><span>的前端</span><code>css</code><span>和</span><code>js</code><span>文件，加载到模板中。</span></p><p><span>模板使用的是框架配套的</span><code>jinja2</code><span>，各个网页通过继承</span><code>base.html</code><span>文件来达成各自的效果：</span></p><ul><li><p><code>base.html</code><span>：基HTML文件，提供了对于整体网页架构的约束，含有几个块（block）</span></p><ul><li><span>site_name：网页名字（HTML-header部分），应该在模板中替换</span></li><li><span>header：网页的顶部标题</span></li><li><span>left_body：左侧侧边栏，占据</span><code>3/12</code><span>的比例，用来放置跳转连接</span></li><li><span>right_body：右侧主体，放网页的主体内容</span></li></ul></li></ul><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="html" style="break-inside: unset;"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="html"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 45px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 37px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><span><span>​</span>x</span></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -37px; width: 37px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-meta">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-meta">"http://www.w3.org/TR/html4/loose.dtd"&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">script</span> <span class="cm-attribute">src</span>=<span class="cm-string">"https://how2j.cn/study/js/jquery/2.0.0/jquery.min.js"</span><span class="cm-tag cm-bracket">&gt;&lt;/</span><span class="cm-tag">script</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">&lt;!--&lt;link href="https://how2j.cn/study/css/bootstrap/3.3.6/bootstrap.min.css" rel="stylesheet"&gt;--&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">&lt;!--&lt;script src="https://how2j.cn/study/js/bootstrap/3.3.6/bootstrap.min.js"&gt;&lt;/script&gt;--&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">6</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">link</span> <span class="cm-attribute">href</span>=<span class="cm-string">"{{ url_for('static', filename = 'css/bootstrap.min.css') }}"</span> <span class="cm-attribute">rel</span>=<span class="cm-string">"stylesheet"</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">7</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">script</span> <span class="cm-attribute">src</span>=<span class="cm-string">"{{ url_for('static', filename = 'js/bootstrap.min.js') }}"</span><span class="cm-tag cm-bracket">&gt;&lt;/</span><span class="cm-tag">script</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">8</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="">​</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">9</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">html</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">10</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;<span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">head</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">11</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">title</span><span class="cm-tag cm-bracket">&gt;</span>{% block site_name %}网页名字，应该在模板中替换{% endblock %}<span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">title</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">12</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;<span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">head</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">13</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;<span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">body</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">14</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">div</span> <span class="cm-attribute">class</span>=<span class="cm-string">"container-fluid"</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">15</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="">​</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">16</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">div</span> <span class="cm-attribute">class</span>=<span class="cm-string">"row"</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">17</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">div</span> <span class="cm-attribute">class</span>=<span class="cm-string">"col-md-12"</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">18</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">h1</span> <span class="cm-attribute">class</span>=<span class="cm-string">"text-center"</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">19</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;  {% block header %}顶部标题{% endblock %}</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">20</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">h1</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">21</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">div</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">22</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">div</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">23</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="">​</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">24</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="">​</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">25</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">div</span> <span class="cm-attribute">class</span>=<span class="cm-string">"row"</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">26</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">div</span> <span class="cm-attribute">class</span>=<span class="cm-string">"col-md-3"</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">27</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;  {% block left_body %}</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">28</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">ul</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">29</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">li</span> <span class="cm-attribute">class</span>=<span class="cm-string">"list-item"</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">30</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  左侧列表栏</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">31</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">li</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">32</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">li</span> <span class="cm-attribute">class</span>=<span class="cm-string">"list-item"</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">33</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  建议每次都替换</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">34</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">li</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">35</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">ul</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">36</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;  {% endblock %}</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">37</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">div</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">38</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">div</span> <span class="cm-attribute">class</span>=<span class="cm-string">"col-md-9"</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">39</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;  {% block right_body %}</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">40</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">p</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">41</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  右侧版面主题</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">42</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">p</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">43</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;  {% endblock %}</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">44</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">div</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">45</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="">​</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">46</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">div</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">47</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;<span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">div</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 28px;">48</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;<span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">body</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -37px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 28px;">49</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">html</span><span class="cm-tag cm-bracket">&gt;</span></span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 1098px;"></div><div class="CodeMirror-gutters" style="height: 1098px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 36px;"></div></div></div></div></pre><p><span>对于网页的基本框架，可以在</span><code>boostrap-demo</code><span>页面看到，全体网页都是采用如下的结构：</span></p><ul><li><span>开头一行，放置页面大标题（下面加了一个进度条作为美化）</span></li><li><span>左侧3/12比例为列表，用于网页导航的链接放置</span></li><li><span>右侧9/12为页面主体</span></li></ul><p><span>设计通过一个Boostrap框架构建网站来实现，基本结构效果如图</span></p><p><img src="设计/image-20200613100512419.png" referrerpolicy="no-referrer" alt="image-20200613100512419"></p><h3><a name="初始数据" class="md-header-anchor"></a><span>初始数据</span></h3><p><span>管理员表手工设定4个账号，插入之后效果如下：</span></p><p><img src="设计/image-20200612154637480.png" referrerpolicy="no-referrer" alt="image-20200612154637480"></p><p><span>上述功能在</span><code>data_user.py</code><span>的</span><code>initAdmin</code><span>函数实现</span></p><p>&nbsp;</p><p>&nbsp;</p><p><span>然后随机生成一些学生和老师（借阅者）：</span></p><ul><li><span>姓名是利用网上的起名器，都是三个字的，存在Sname文件里面</span></li><li><span>id分老师学生，是递增输入；老师学生是随机设定的，用于后续不同权限</span></li><li><span>备注暂时置空，被禁用设置为0（没有被禁）</span></li><li><span>在插入借阅者数据的同时，为用户数据操作记录表添加记录【同时对两个表进行操作】</span></li></ul><p><img src="设计/image-20200612155030801.png" referrerpolicy="no-referrer" alt="image-20200612155030801"></p><p><img src="设计/image-20200612155100802.png" referrerpolicy="no-referrer" alt="image-20200612155100802"></p><p><img src="设计/image-20200612155131858.png" referrerpolicy="no-referrer" alt="image-20200612155131858"></p><p><span>功能在函数</span><code>randUser(n)</code><span>实现</span></p><p>&nbsp;</p><p><span>再生成一批图书：</span></p><ul><li><span>此处由于图书要比较高的真实性，所以采用豆瓣的数据</span></li><li><span>先手动从豆瓣摘取一些数据，存储在本地</span></li><li><span>然后将图书数据插入数据库</span></li><li><span>插入的同时留存图书入库记录【同时插入两表】</span></li></ul><p><img src="设计/image-20200612160151427.png" referrerpolicy="no-referrer" alt="image-20200612160151427"></p><p><img src="设计/image-20200612160220611.png" referrerpolicy="no-referrer" alt="image-20200612160220611"></p><p>&nbsp;</p><h3><a name="用户端功能" class="md-header-anchor"></a><span>用户端功能</span></h3><h4><a name="登录" class="md-header-anchor"></a><span>登录</span></h4><p><span>涉及函数：</span><code>user</code><span>,</span><code>user_login</code></p><p><span>测试流程见截图，首先在user界面输入账号密码，然后根据是否成功有登录后和登录失败两个界面；</span></p><p><img src="设计/image-20200613111346658.png" referrerpolicy="no-referrer" alt="image-20200613111346658"></p><p><span>初始在</span><code>/user/</code><span>网页如图</span></p><p><img src="设计/image-20200613111411114.png" referrerpolicy="no-referrer" alt="image-20200613111411114"></p><p><span>登录失败，通过flask的redirect函数可以传递参数的特点，返回到</span><code>/user/?error=True</code><span>，从而网页获得一个GET的参数error，判定为登录失败，弹出红字提示。</span></p><p><img src="设计/image-20200613111628623.png" referrerpolicy="no-referrer" alt="image-20200613111628623"></p><p><span>登录成功后效果如图，</span><strong><span>学生</span></strong><span>是用户账号类型，</span><strong><span>秦弘致</span></strong><span>为用户姓名，下方有一个退出按钮</span></p><h4><a name="登出" class="md-header-anchor"></a><span>登出</span></h4><p><span>涉及函数</span><code>user_logout</code></p><p><span>点击上面的登出按钮，发送信息到</span><code>user/logout/</code><span>，将登录的信息清除后返回</span><code>/user/</code><span>页面，和初始进入相同。</span></p><h4><a name="注册" class="md-header-anchor"></a><span>注册</span></h4><p><span>注册功能实现了对于表UserList和UAlter的同时插入，涉及的函数是</span><code>user_signup</code></p><p><span>注册页面：</span></p><p><img src="设计/image-20200613092455608.png" referrerpolicy="no-referrer" alt="image-20200613092455608"></p><p><span>利用JS的函数，实现了对于两次密码的一致性检查，如果不一致，按钮会被禁用，从而保证密码是准确的。</span></p><p><img src="设计/image-20200614203855694.png" referrerpolicy="no-referrer" alt="image-20200614203855694"></p><p><span>相应的数据库插入信息</span></p><p><img src="设计/image-20200613093822453.png" referrerpolicy="no-referrer" alt="image-20200613093822453"></p><p><img src="设计/image-20200613093846058.png" referrerpolicy="no-referrer" alt="image-20200613093846058"></p><h4><a name="图书信息查询" class="md-header-anchor"></a><span>图书信息查询</span></h4><p><span>涉及的页面是</span><code>/user/search/</code><span>函数是</span><code>book_search</code></p><p><img src="设计/image-20200614204103729.png" referrerpolicy="no-referrer" alt="image-20200614204103729"></p><p><span>在查询之后，查询信息&amp;页码通过GET方法发送到这个页面自身：</span></p><p><img src="设计/image-20200614204201097.png" referrerpolicy="no-referrer" alt="image-20200614204201097"></p><p><img src="设计/image-20200614204147493.png" referrerpolicy="no-referrer" alt="image-20200614204147493"></p><h4><a name="图书借阅" class="md-header-anchor"></a><span>图书借阅</span></h4><p><span>显示页面是</span><code>/user/borrow/</code><span>，涉及的函数为</span><code>book_borrow</code><span>,</span><code>book_add</code><span>,</span><code>book_act</code></p><p><span>点击上面的“我要借书”按钮将书添加到借书的“购物车”，如果点击“看看有没有其他书”就回到查找界面，如果选好日期并借阅，那么将执行借书操作，然后清空列表，回到用户主界面</span><code>/user/</code><span>。</span></p><p><img src="设计/image-20200614204407323.png" referrerpolicy="no-referrer" alt="image-20200614204407323"></p><p><span>清空之后的“购物车”是这个样子：</span></p><p><img src="设计/image-20200614204537227.png" referrerpolicy="no-referrer" alt="image-20200614204537227"></p><h4><a name="图书归还与续借" class="md-header-anchor"></a><span>图书归还与续借</span></h4><p><span>涉及页面</span><code>/user/return/</code><span>，涉及的函数是</span><code>book_return</code><span>,</span><code>book_return_act</code><span>,</span><code>book_return_addtime</code></p><p><span>续借以后不可以继续续借，没有续借的可以还书或者续借</span></p><p><img src="设计/image-20200614204801574.png" referrerpolicy="no-referrer" alt="image-20200614204801574"></p><h3><a name="管理端基础" class="md-header-anchor"></a><span>管理端基础</span></h3><p><span>基本逻辑同用户端，显示页面为</span><code>/admin/</code><span>对应函数是</span><code>admin</code></p><p><img src="设计/image-20200614204941150.png" referrerpolicy="no-referrer" alt="image-20200614204941150"></p><h3><a name="用户管理" class="md-header-anchor"></a><span>用户管理</span></h3><p><span>总体如图</span><code>/admin/user-control/</code><span>：</span></p><p><img src="设计/image-20200614210048142.png" referrerpolicy="no-referrer" alt="image-20200614210048142"></p><h4><a name="被禁用的账号" class="md-header-anchor"></a><span>被禁用的账号</span></h4><p><span>被禁用的用户可以在管理这边进行解禁，点击按钮即可。</span></p><p><span>涉及的处理函数为</span><code>free_act</code></p><h4><a name="逾期不还书封号" class="md-header-anchor"></a><span>逾期不还书封号</span></h4><p><img src="设计/image-20200614174540589.png" referrerpolicy="no-referrer" alt="image-20200614174540589"></p><p><img src="设计/image-20200614175226281.png" referrerpolicy="no-referrer" alt="image-20200614175226281"></p><p><span>根据流程增加了新的违规学生</span></p><h4><a name="固定参数统计图" class="md-header-anchor"></a><span>固定参数统计图</span></h4><p><span>显示了不同类用户的数目柱状图</span></p><h3><a name="图书管理" class="md-header-anchor"></a><span>图书管理</span></h3><h4><a name="已知图书管理" class="md-header-anchor"></a><span>已知图书管理</span></h4><p><span>页面</span><code>/admin/book-control/</code><span>对应函数为</span><code>admin_book_reset</code><span>,</span><code>admin_book_remove</code></p><p><span>在库图书的显示</span></p><p><img src="设计/image-20200614205314023.png" referrerpolicy="no-referrer" alt="image-20200614205314023"></p><p><span>已经被下架图书的显示</span></p><p><img src="设计/image-20200614205351008.png" referrerpolicy="no-referrer" alt="image-20200614205351008"></p><h4><a name="图书入库" class="md-header-anchor"></a><span>图书入库</span></h4><p><span>对应的网页是</span><code>/admin/book-control/add/</code><span>，函数是</span><code>admin_book_add</code></p><p><span>添加图书入库操作：</span></p><p><img src="设计/image-20200614165100679.png" referrerpolicy="no-referrer" alt="image-20200614165100679"></p><p><img src="设计/image-20200614165602234.png" referrerpolicy="no-referrer" alt="image-20200614165602234"></p><p>&nbsp;</p><h3><a name="超级管理" class="md-header-anchor"></a><span>超级管理</span></h3><p><span>展示历史上对应用户和实体的操作记录，5个一页，可以翻页，效果如图</span></p><p><img src="设计/image-20200614210621660.png" referrerpolicy="no-referrer" alt="image-20200614210621660"></p><h3><a name="数据展示" class="md-header-anchor"></a><span>数据展示</span></h3><p><span>对应页面</span><code>/admin/data/</code><span>函数,</span><code>admin_data</code></p><p><span>这是一个根据参数产生统计图的页面（主要是图书管理中汇总统计比较少有，所以就选择了根据指定标签找图书和数目）</span></p><p><img src="设计/image-20200614192400277.png" referrerpolicy="no-referrer" alt="image-20200614192400277"></p><p>&nbsp;</p><h2><a name="总结" class="md-header-anchor"></a><span>总结</span></h2><p><span>1基础</span></p><ul><li class='md-task-list-item task-list-item task-list-done' ><input type='checkbox' disabled='disabled' checked/><p><span>使用基础数据集，建库建表插入基础数据</span></p></li><li class='md-task-list-item task-list-item task-list-done' ><input type='checkbox' disabled='disabled' checked/><p><span>固定参数(直接在代码里写死)，对数据库进行汇总统计，用html table显示结果</span></p></li><li class='md-task-list-item task-list-item task-list-done' ><input type='checkbox' disabled='disabled' checked/><p><span>固定参数(直接在代码里写死)，对数据库进行汇总统计，用柱状图或者饼图显示结果</span></p></li></ul><p><span>2进阶</span></p><ul><li class='md-task-list-item task-list-item task-list-done' ><input type='checkbox' disabled='disabled' checked/><p><span>允许用户输入参数，对数据库进行汇总统计，用html table显示结果【图书信息查询】</span></p></li><li class='md-task-list-item task-list-item task-list-done' ><input type='checkbox' disabled='disabled' checked/><p><span>允许用户输入参数，对数据库进行汇总统计，用柱状图或者饼图显示结果【数据展示】</span></p></li></ul><p><span>3高级</span></p><ul><li class='md-task-list-item task-list-item task-list-done' ><input type='checkbox' disabled='disabled' checked/><p><span>使用基础数据集、可以增删改基础数据集</span></p></li><li class='md-task-list-item task-list-item task-list-done' ><input type='checkbox' disabled='disabled' checked/><p><span>网站包括home,insert,delete,upate,query（对数据库进行汇总统计）等完整的功能</span></p></li></ul><p><span>4加分项</span></p><ul><li class='md-task-list-item task-list-item task-list-done' ><input type='checkbox' disabled='disabled' checked/><p><span>图和table同时显示在一个网页上【用户管理页】</span></p></li><li class='md-task-list-item task-list-item task-list-done' ><input type='checkbox' disabled='disabled' checked/><p><span>如果能够实现1:n的两个表格数据的输入【类似购物车式的图书借阅】</span></p><p><span>数据模型构建完整</span></p><p><span>功能模型构建完整</span></p></li></ul><p><span>5我的项目特色</span></p><ul><li><span>基于Boostrap美化了前端的呈现效果，支持不同浏览器以及缩放。</span></li><li><span>提供了基于session的用户登录认证，并且对于没有登录的情况重定向到登录页面</span></li><li><span>为用户、图书管理员、用户管理员、超级管理提供了不同的权限和外模式，保证了安全性和独立性</span></li><li><span>提供了运用JS函数的表单检查，保证两次输入密码相同才可以注册/修改密码</span></li><li><span>在用户的基础业务之外为管理工作也设置了数据库和操作界面，每次的增删改都有迹可循</span></li><li><span>图片使用echart，因为是JS所以可以随鼠标移动而改变</span></li><li><span>配置了虚拟环境（不过这个项目可以不用虚拟环境）</span></li></ul><p>&nbsp;</p><p>&nbsp;</p><h2><a name="参考文献和资料" class="md-header-anchor"></a><span>参考文献和资料</span></h2><p><span>虚拟环境的配置：</span></p><ul><li><a href='https://blog.csdn.net/guying4875/article/details/80905472' target='_blank' class='url'>https://blog.csdn.net/guying4875/article/details/80905472</a></li><li><a href='https://blog.csdn.net/happy_bigqiang/article/details/51168614?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-4' target='_blank' class='url'>https://blog.csdn.net/happy_bigqiang/article/details/51168614?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-4</a></li><li><a href='https://blog.csdn.net/Growing_hacker/article/details/89518534' target='_blank' class='url'>https://blog.csdn.net/Growing_hacker/article/details/89518534</a></li></ul><p><span>boostrap参考：</span></p><ul><li><a href='https://how2j.cn/k/boostrap/boostrap-setup/539.html' target='_blank' class='url'>https://how2j.cn/k/boostrap/boostrap-setup/539.html</a><span>如何使用boostrap（不涉及flask）</span></li><li><a href='https://v4.bootcss.com/docs/getting-started/download/' target='_blank' class='url'>https://v4.bootcss.com/docs/getting-started/download/</a><span> boostrap安装到本地</span></li><li><a href='https://www.layoutit.com/build' target='_blank' class='url'>https://www.layoutit.com/build</a><span> 网页设计</span></li></ul><p><span>flask整体教程：</span></p><ul><li><a href='https://www.w3cschool.cn/flask/' target='_blank' class='url'>https://www.w3cschool.cn/flask/</a><span> W3教程</span></li><li><a href='https://blog.csdn.net/hanbo6/article/details/82563015' target='_blank' class='url'>https://blog.csdn.net/hanbo6/article/details/82563015</a><span>；</span><a href='https://blog.csdn.net/wei18791957243/article/details/85237246' target='_blank' class='url'>https://blog.csdn.net/wei18791957243/article/details/85237246</a><span>用户登录功能的session方法</span></li></ul><p><span>SQL server相关：</span></p><ul><li><a href='https://docs.microsoft.com/zh-cn/sql/relational-databases/tables/create-foreign-key-relationships?view=sql-server-ver15' target='_blank' class='url'>https://docs.microsoft.com/zh-cn/sql/relational-databases/tables/create-foreign-key-relationships?view=sql-server-ver15</a>
<span>创建外键关系</span></li></ul><p><span>数据资源：</span></p><ul><li><a href='https://www.qqxiuzi.cn/zh/xingming/' target='_blank' class='url'>https://www.qqxiuzi.cn/zh/xingming/</a><span>姓名生成器</span></li><li><span>豆瓣读书</span></li></ul><p><span>FLASK+ECHARTS：</span></p><ul><li><a href='https://blog.csdn.net/u013421629/article/details/78183315?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&amp;depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase' target='_blank' class='url'>https://blog.csdn.net/u013421629/article/details/78183315?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase</a><span> Flask+Echarts 实现动图图表</span></li><li><a href='https://blog.csdn.net/weixin_34186128/article/details/91974308' target='_blank' class='url'>https://blog.csdn.net/weixin_34186128/article/details/91974308</a><span>【通过tojson过滤器可以传参给js】</span></li><li><a href='https://my.oschina.net/tinyhare/blog/756485' target='_blank' class='url'>https://my.oschina.net/tinyhare/blog/756485</a><span>【通过定义js变量来传递数据】</span></li></ul><p><span>JavaScript：</span></p><ul><li><a href='https://blog.csdn.net/wangjian530/article/details/90343105' target='_blank' class='url'>https://blog.csdn.net/wangjian530/article/details/90343105</a><span> 利用js检验表单数据</span></li></ul><p><span>时间处理：</span></p><ul><li><a href='https://blog.csdn.net/cmzsteven/article/details/64906245' target='_blank' class='url'>https://blog.csdn.net/cmzsteven/article/details/64906245</a><span> python时间处理包</span></li><li><a href='https://www.cnblogs.com/huzhe123/p/9308057.html' target='_blank' class='url'>https://www.cnblogs.com/huzhe123/p/9308057.html</a><span>格式化讲解</span></li><li><a href='https://blog.csdn.net/appleheshuang/article/details/9139025' target='_blank' class='url'>https://blog.csdn.net/appleheshuang/article/details/9139025</a><span> 时间加减法</span></li></ul><p>&nbsp;</p></div>
</body>
</html>